在上节我们是使用POSITION来得到模型的顶点位置,假如我们想获取更多的模型数据那???例如获取纹理坐标,法线方向
答案就是结构体
//使用一个结构体来定义顶点着色器的输入
struct a2v {
float4 vertex : POSITION;
//POSITION语义告诉引擎用模型空间空间顶点坐标填充vertex
float3 normal : NORMAL;
//NORMAL就告诉引擎用模型的空间法线方向填充normal变量
float4 texcoord : TEXCOORD0;
//TEXCOOD0告诉引擎用模型的第一套uv填充texcoord变量
};
我们定义了一个a2v结构体,里面含有模型数据。
在unity中,使用该材质的meshrender组件提供这些数据来填充上述语义的数据,在调用drawcall时候,meshrender组件会把它渲染的模型数据给unityshader。模型数据有很多,例如顶点颜色了等等,通过定义结构体我们就可以在顶点着色器中访问这些模型数据。
顶点着色器与片元着色器交互
有时候我们希望从顶点着色器中输出一些数据,例如模型的纹理坐标,法线进行传递给片元着色器,他们是怎样交互的那?
//来定义顶点着色器的输出
struct v2f {
float4 pos : SV_POSITION;
//SV_POSITION告诉引擎pos中存储是顶点在裁剪空间中的位置信息
fixed3 color : COLOR0;
//COLOR0表示存储颜色信息
};
v2f结构体用于在顶点着色器和片元着色器之间传递消息,顶点着色逐顶点调用,片元着色器逐片元调用,片元着色器的输入实际就是顶点着色器的输出进行差值后得到的
欢迎关注我的微博,给大家带来欢乐