Unity Shader — 结构体

一、结构体介绍

在实际编写过程中,着色器通常需要输入输出多个参数。结构体的作用在于可以同时将顶点坐标、法线向量和第一套UV等传入到顶点着色器,然后再同时输出裁切空间的顶点坐标、世界空间顶点坐标、世界空间法线向量和纹理坐标到片段着色器。
由于函数有多个输入输出,结构体可以让代码编写更加方便,且美观。

二、结构体语法

结构体允许存储多个不同类型的变量,并且将多个变量包装成为一个整体进行输入或者输出。
结构体语法如下:

struct Type
{
	//变量
};

Type:当前结构体定义的一种类型,着色器函数定义输入和输出数据类型时会用到。
参考示例:

Shader "Unlit/structExample"
{
    Properties
    {
        _MainColor ("Main Color", Color) = "white" {}
        _MainTex("Main Tex",2D)="white"{}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            //定义顶点着色器的输入结构体
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            //定义顶点着色器的输出结构体
            struct v2f
            {
                float4 position : SV_POSITION;
                float2 texcoord : TEXCOORD0;
            };

            fixed4 _MainColor;
            sampler2D _MainTex;
            float4 _MainTex_ST;

            void vert(appdata v,out  v2f o)
            {
                o.position = UnityObjectToClipPos(v.vertex);
                o.texcoord = v.uv*_MainTex_ST.xy+_MainTex_ST.zw;
            }

            void frag(v2f i,out fixed4 color:SV_Target) 
            {
              color=tex2D(_MainTex,i.texcoord)*_MainColor;
            }
            ENDCG
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40120946/article/details/122225245