[UnityShader学习日志]1.第五章实验代码记录

第五章实验

第一个Shader-最简单的顶点/片元着色器

Shader "Unlit/NewUnlitShader"
{
	SubShader{
		Pass{
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag

			float4 vert(float4 v : POSITION) : SV_POSITION{
				return mul(UNITY_MATRIX_MVP,v);
			}
			//通过POSITION获取顶点数据,并且返回到SV_POSITION中

			fixed4 frag() : SV_TARGET0{
				return fixed4(1.0,1.0,1.0,1.0);
			}
			//(1,1,1)表示白色
			
			ENDCG
	}
}
}
  • Pass中将填写Cg代码片段,,CGPROGRAM,宣告CG代码的开始,首先需要进行编译指令(类似于声明函数?)其中的vert和frag是随意取的名字,分别代表顶点着色器和片元着色器的编译指令。
  • float4以及fixed4都是Cg中的变量类型,都是浮点型,区别在于精度,fixed4 最低而float4最高,精度的高低在后期可能影响到性能的问题
  • POSITION以及SV_TARGET0都是Cg的语义,实际上就是一个赋给 Shader输入和输出的字符串,通俗的讲,这可以让Shader知道从哪里读取数据,又把数据输出到哪里,起到一个指代性的作用
  • POSITION将告诉Unity把模型的顶点坐标填充到参数v中,SV_POSITION将告诉Unity顶点着色器的输出是裁剪空间中的顶点坐标。

使用结构体

  • 改写之前的代码,这次加入结构体,并且使用更多语义
Shader "Unlit/NewUnlitShader"
{
	SubShader{
		Pass{
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag

			struct a2v
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL; //法线
				float4 texcoord : TEXCOORD; //使用模型的第一套纹理(以后会提到)
			};

			float4 vert(a2v v) : SV_POSITION{
				return UnityObjectToClipPos(v.vertex);
			}

			fixed4 frag() : SV_TARGET0{
				return fixed4(1.0,1.0,1.0,1.0);
			}


			ENDCG
	}
}
}
  • 法线为什么是三维矢量: 因为在矩阵变换时,由于发现方向矢量,并不会受到平移变换的影响

实现顶点与片元着色器通信

Shader "Unlit/NewUnlitShader"
{
	SubShader{
		Pass{
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag

			struct a2v
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				fixed3 color : COLOR0;

			};


			v2f vert(a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);
				return o;
			} 

			fixed4 frag(v2f i) : SV_Target{
				return fixed4(i.color,1.0);
			}


			ENDCG
	}
}
}

增加属性:颜色拾取器

Shader "Unlit/NewUnlitShader"
{
	Properties{
			_Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)
		}

		
	SubShader{
		
		Pass{
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag

			fixed4 _Color;

			struct a2v
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				fixed3 color : COLOR0;

			};


			v2f vert(a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);
				return o;
			} 

			fixed4 frag(v2f i) : SV_Target{
				fixed3 c = i.color;
				c *=_Color.rgb;
				return fixed4(c,1.0);
			}


			ENDCG
	}
}
}
posted @ 2023-04-13 17:16  月牙同学  阅读(26)  评论(0)    收藏  举报