UnityShader-基础篇

一段基础的UnityShader代码如下(该代码无Properties部分):

Shader "Custom/StandardShader"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct a2v{
                float4 pos : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f{
                float4 pos : SV_POSITION;
                float3 col : COLOR;
            };

            v2f vert(a2v i){
                v2f o;
                o.pos = UnityObjectToClipPos(i.pos);
                o.col = i.normal * 0.5 + float3(0.5, 0.5, 0.5);
                return o;
            }

            half4 frag(v2f i) : SV_TARGET0{
                return half4(i.col, 1.0);
            }
            ENDCG
        }
    }
}

自定义结构体:

a2v : application to vertex,从应用程序到顶点着色器,一般会包含顶点坐标(POSITION),顶点法线(NORMAL)等参数信息。

v2f : vertex to fragment,从顶点着色器到片元着色器,一般必须包含顶点坐标信息(SV_POSITION)。

        除了自定义结构体外,"UnityCG.cginc"中也包含一部分预配置的结构体:

        同时,该段代码中也使用了许多的shader语义。

        语义,其实就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。通俗的讲这些语义可以让Shader知道从哪读取输送到哪里去,他们是在CG/HLSL的shader流水线中是不可避免。

        部分常使用的语义有:

更多有关unityshader语义与变量的内容:UnityShader常用语义和变量 - 知乎 (zhihu.com) 

         语义TEXCOORDn,为顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标以此类推,通常是float2或float4类型。语义TEXCOORDn即会出现在顶点着色器中,也经常出现在片元着色器中。出现在顶点着色器中时,一般是利用贴图实现对顶点的偏移等效果,如波浪效果;出现在片元着色器中时,一般是作为材质的贴图使用。

        而SV_Target 等同于DirectX9中的COLOR,但我们最好用SV_Target。表示的是将输出数据
传递给render_target(渲染目标)。

        为了让Shader能够在所有平台上正常工作,我们应该尽可能使用下面的语义来描述Shader的输入输出变量。

posted @ 2022-02-12 22:34  PAddingoi  阅读(2)  评论(0编辑  收藏  举报  来源