一个简单的顶点/片元着色器(续)

一个简单的顶点/片元着色器(续)

  • 顶点着色器和片元着色器之间的通信
    • 顶点着色器的输入
    • 顶点着色器的输出
    • 完整的代码

参考资料: Unity Shader 入门精要 冯乐乐著 第5章开始Unity Shder 学习之旅 P101

顶点着色器和片元着色器之间的通信

顶点着色器的输入

//定义一个结构体,用来作为顶点着色器的输入
			struct a2v{
				float4 vertex:POSITION;
				float3 normal:NORMAL;//法线,暂时用不到
				float4 texcoord:TEXCOORD;//纹理,暂时用不到
			};

顶点着色器的输出

//定义一个结构体,用来作为顶点着色器的输出,也就是片元着色器的输入
			struct v2f{
				float4 pos:SV_POSITION;//SV_POSITION  是Unity定义的语义,代表是在裁剪空间
				fixed3 color:COLOR0;
			};   

完整的代码

Shader "Custom/test_shader_light"
{
    Properties
    {
      //声明了一个属性
	   _Color ("Color Tint",Color) =(1.0,1.0,1.0,1.0)
    }
    SubShader
    {
		Pass{
	
			CGPROGRAM

			//编译指令,它们将告诉Unity ,哪个函数包含了顶点着色器的代码,哪个函数包含了片元着色器的代码
			#pragma vertex vert		
			#pragma fragment frag

			//在Unity 中,必须要有变量名与Properties 中定义的的属性名保持一致
			fixed4 _Color;

			//定义一个结构体,用来作为顶点着色器的输入
			struct a2v{
				float4 vertex:POSITION;
				float3 normal:NORMAL;//法线,暂时用不到
				float4 texcoord:TEXCOORD;//纹理,暂时用不到
			};

			//定义一个结构体,用来作为顶点着色器的输出,也就是片元着色器的输入
			struct v2f{
				float4 pos:SV_POSITION;//SV_POSITION  是Unity定义的语义,代表是在裁剪空间
				fixed3 color:COLOR0;
			};


			//顶点着色器的代码,它将模型空间的点转换到裁剪坐标系中。
			 v2f vert(a2v v){
				 v2f o;
				 o.pos = UnityObjectToClipPos(v.vertex);
				 o.color = fixed3(0.5,0.5,0.5);//没有特别的含义
				 return o;
			 }

			 //片元着色器的代码,直接使用定义的Color 属性
			 fixed4 frag(v2f i ):SV_Target{	
				fixed3 c = i.color;
				c *= _Color.rgb;			
				return fixed4(c,1.0);
			 }       
			ENDCG
		}
    }
    FallBack "Diffuse"
}

一个简单的顶点/片元着色器(续)_第1张图片需要注意的是,顶点着色器是逐顶点调用的,而片元着色器是逐片元调用的。片元着色器的输入实际是把顶点着色器的输出金星插值后得到的结果

你可能感兴趣的:(Unity,Shader)