先分析

Shader作为显卡中会被执行的一段小程序,执行入口是以函数为单位的。入口的定义,我们可以从#pragma看到,既然入口是函数,那么入口函数被执行时是存在上下文的,上下文中存在的的参数和函数成为了现在我迫切想要知道的内容:到底有哪些参数和辅助函数呢?

我们先从一小段Shader先开始
Shader "VertexInputSimple" {
    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f {
                float4 pos : SV_POSITION;
                fixed4 color : COLOR;
            };

            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color.xyz = v.normal * 0.5 + 0.5;
                o.color.w = 1.0;
                return o;
            }

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

vert函数参数有哪些?

Shader中的参数,决定了在函数被执行时我们可以操作哪些源数据(输入参数)

pragma vertex vert定义了vert函数,vert函数将被自动执行,appdata_base结构体携带了参数。

结构体appdata_base包含哪些数据呢?

[Unity官方]
1. appdata_base: 位置, 法线 and (一个)纹理坐标.
2. appdata_tan: 位置, tangent, normal and one texture coordinate.
3. appdata_full: position, tangent, normal, four texture coordinates and color.
Unity预设了上面123个结构体供我们使用,我们也可以自己定义struct来定义我们需要的参数。

自定义结构体

例如:

// vertex input: position, UV
struct appdata {
    float4 vertex : POSITION;
    float4 texcoord : TEXCOORD0;
};

参数语义的意义
1. POSITION 顶点位置, 一般是float3 or float4类型.
2. NORMA 顶点法线, 一般是float3类型.
3. TEXCOORD0 是第一个UV坐标, 一般是float2, float3 or float4类型.
4. TEXCOORD1, TEXCOORD2 and TEXCOORD3 是第2,3,4 UV坐标.
5. TANGENT 是tangent 向量 (用于法线贴图), 一般是float4.
6. COLOR 是每个顶点的颜色, 一般是float4.

延伸: 除了预定义的这些结构体,Unity还提供了哪些预定义内容呢?见下一章