跳转至

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

示例代码
Shader "Unity Shaders Book/Chapter 5/Simple Shader"{
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 : TEXCOORD0;
        };

        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下可以有多个 SubShader(每个SubShader表示适配某个显卡,如果都不适配,则会调用默认的SubShader)
  • Properties :在里面定义一些属性。

在定义属性的时候,要注意与Properties中声明的类型和属性名称保持一致

  • a2v :application to vertex shader
  • v2f :vertex shader to fragment shader
  • #pragma vertex name :用于表明,name函数是vertex内的。frag同理。
  • 关于语义 : 在上文的 SV_POSITION,POSITION这些皆为语义,用来告诉渲染器这些变量从哪来到哪去。

顶点着色器的输出结构必须包含SV_POSITION。顶点着色器主要功能是将顶点从模型空间转换到裁剪空间,并通过SV_POSITION告诉渲染器。