UnityShader-基础篇

本文解析了一段Unity Shader代码,介绍了自定义结构体a2v和v2f的作用,以及如何使用UnityCG.cginc中的预设结构和Shader语义,如TEXCOORD和SV_Target。讲解了语义在Shader中的关键作用和跨平台兼容性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一段基础的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的输入输出变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值