效果预览
最基础的顶点/片元着色器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//最基础的顶点片元着色器 Shader "Study/01" { SubShader{ Pass{ CGPROGRAM #pragma vertex vert //告诉Unity,vert函数包含了顶点着色器的代码,vert为函数名,可自行修改,但一般使用vert,比较直观。 #pragma fragment frag //告诉Unity,frag函数包含了片元着色器的代码,frag为函数名,可自行修改,但一般使用frag,比较直观。 float4 vert (float4 v : POSITION):SV_POSITION{ //POSITION修饰v,意义为把模型的顶点坐标填充到v。 //SV_POSITION修饰函数vert的返回值,意义为顶点着色器的输出是裁剪空间中的顶点坐标。 //return mul(UNITY_MATRIX_MVP,v) 书中语句已被Unity自动替换会下面语句,意义为把顶点坐标从模型空间转换到裁剪空间。 return UnityObjectToClipPos(v); } fixed4 frag():SV_Target{ //SV_Target告诉渲染器,把用户的输出颜色存储到一个渲染目标中,(这里SV_Target并没有变色,不知道是不是有错误。) //返回一个纯色fixed4类型,因为这里我修改成了(0.5,0.5,0.5,1.0)所以显示为灰色。 return fixed4(0.5,0.5,0.5,1.0); } ENDCG } } } |
获取更多的模型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//获取更多的模型数据 Shader "Study/02" { SubShader{ Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag //使用一个结构体来定义顶点着色器的输入 struct a2v{ float4 vertex : POSITION; //POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量 float3 normal : NORMAL; //NORMAL语义告诉Unity,用模型空间的发现方向填充normal变量 float4 texcoord : TEXCOORD0; //TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量 }; float4 vert (a2v v):SV_POSITION{ return UnityObjectToClipPos(v.vertex); //用v.vertex来访问模型空间的顶点坐标。 } fixed4 frag():SV_Target{ //因为这里我修改成了(57/255.0,197/255.0,187/255.0,1.0)所以显示为初音蓝色。 return fixed4(57/255.0,197/255.0,187/255.0,1.0); } ENDCG } } } |
顶点着色器和片元着色器之间的通信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//顶点着色器和片元着色器之间的通信 Shader "Study/03" { SubShader{ Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag //使用一个结构体来定义顶点着色器的输入 struct a2v{ float4 vertex : POSITION; //POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量 float3 normal : NORMAL; //NORMAL语义告诉Unity,用模型空间的发现方向填充normal变量 float4 texcoord : TEXCOORD0; //TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量 }; //使用一个结构体来定义片元着色器的输出 struct v2f{ float4 pos : SV_POSITION; //SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息 fixed3 color : COLOR0; //COLOR0语义可以用于存储颜色信息 }; v2f vert (a2v v){ v2f o; //声明输出结构 o.pos = UnityObjectToClipPos(v.vertex ); //这里Unity又自动转换了 Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5); //因为v.normal包含的顶点法线方向的分量范围在【-1.0,1.0】之间,需要映射到范围【0.0-1.0】,然后存储到o.color中 return o; } fixed4 frag(v2f i):SV_Target{ return fixed4(i.color,1.0); //将差值后的i.color显示到屏幕上,屏幕显示为彩虹色。 } ENDCG } } } |
使用属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
//使用属性 Shader "Study/04" { Properties{ _Color ("Color Tint",Color) = (1.0,1.0,1.0,1.0) //声明一个Color类型的属性(上面颜色参数我改了但是不起作用,是不是取色器就是默认白色???) } SubShader{ Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag fixed4 _Color; //在Cg代码中,定义一个与属性名称和类型都匹配的变量 //使用一个结构体来定义顶点着色器的输入 struct a2v{ float4 vertex : POSITION; //POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量 float3 normal : NORMAL; //NORMAL语义告诉Unity,用模型空间的发现方向填充normal变量 float4 texcoord : TEXCOORD0; //TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量 }; //使用一个结构体来定义片元着色器的输出 struct v2f{ float4 pos : SV_POSITION; //SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息 fixed3 color : COLOR0; //COLOR0语义可以用于存储颜色信息 }; v2f vert (a2v v){ v2f o; //声明输出结构 o.pos = UnityObjectToClipPos(v.vertex ); //这里Unity又自动转换了 Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5); //因为v.normal包含的顶点法线方向的分量范围在【-1.0,1.0】之间,需要映射到范围【0.0-1.0】,然后存储到o.color中 return o; } fixed4 frag(v2f i):SV_Target{ fixed3 c = i.color; c *= _Color.rgb; //使用_Color 属性来控制输出颜色,依然显示彩虹色。 return fixed4(c,1.0); } ENDCG } } } |
- 本文固定链接: http://www.u3d8.com/?p=2541
- 转载请注明: 网虫虫 在 u3d8.com 发表过