版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/yy763496668 https://blog.csdn.net/yy763496668/article/details/82620726
在《 Shader_vert和frag函数的学习004》中我们我们使用POSITION语义得到了模型的顶点位置,如果我们想得到更多的模型数据该怎么办呢?比如我们想得到每个顶点的纹理坐标和法线方向。纹理坐标访问纹理,法线可用于计算光照,因此我们要为顶点着色器定义一个新的输入参数,这个参数不再是一个简单的数据类型,而是一个结构体。修改代码如下:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
//漫反射
// 逐顶点光照
Shader "yy/SimpleShader" {
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//定义一个结构体来定义顶点着色器的输入
//把数据从应用阶段传递到顶点着色器中
struct a2v{
//POSITION告诉Unity 用模型空间的顶点坐标填充vertex变量
float4 vertex:POSITION;
//NORMAL告诉Unity 用模型空间的顶点坐标填充normal变量
float3 normal:NORMAL;
//TEXCOORD0告诉Unity 用模型空间的顶点坐标填充texcoord变量
float4 texcoord:TEXCOORD0;
}
float4 vert(a2v v):SV_POSITION{
//使用v.vertex来访问模型空间的顶点坐标
return UnityObjectToClipPos(v.vertex);
}
fixed4 frag():SV_Target
{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
}
POSITION 、NORMAL、TEXCOORD0等语义是由材质的MeshRender组件提供的。在每一帧调用DrawCall的时候,MeshRender组件会把负责渲染的模型数据发送给UnityShader。