一、结构体介绍
在实际编写过程中,着色器通常需要输入输出多个参数。结构体的作用在于可以同时将顶点坐标、法线向量和第一套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
}
}
}