语义是告诉某个变量是做什么的,存储什么东西。
从应用阶段传递模型给顶点着色器时Unity支持的常用语义:
float4 vertex:POSITION;//告诉UNITY吧模型空间下的顶点坐标填充给vertex
float3 normal:NORMAL;//把顶点填充给normal
float4 texcoord:TEXCOORD0;//该顶点的纹理坐标,TEXCO0RD0表示第一组纹理坐标,依次类推
fixed3 Color:Color;//顶点颜色
从顶点着色器传递给片元着色器时Unity常用的语义:
float4 position:SV_POSITION;//表示返回的是剪裁空间下的坐标,必须有
float3 temp:COLOR0;//这个语义可以有用户自己定义,一般存储颜色,不一定必须有
float4 texcoord:TEXCOORD0;//输出纹理坐标,但不是必须的
片元着色器输出时Unity支持的语义:
SV_Target //输出值将会存储到渲染目标
当把一个点从各个空间进行变换时是通过矩阵变换,而shader中有些特定方法,例如:
UNITY_MATRIX_MVP 当前模型观察投影矩阵,用于将顶点矢量从模型空间变换到裁剪空间
UNITY_MATRIX_MV 当前模型观察矩阵,用于将顶点 / 方向从模型空间变换到观察空间
mul(UNITY_MATRIX_MVP,v.ertex);//从模型空间到剪裁空间
mul(_World2Object,v.normal);//从世界空间到到模型空间
反方向调用的话就正好相反
在shader中对于光照来说,光照强度与光照到一个点上和摄像机的角度还有法线有关。关于如何得到摄像机的角度,法线方向等斗鱼特定的API
UnityCG.cginc中一些常用的函数
//摄像机方向(视角方向)
float3 WorldSpaceViewDir(float4 v) 根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向
float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标==》世界空间从这个点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v) 模型空间中的顶点坐标==》模型空间从这个点到摄像机的观察方向
//光源方向
float3 WorldSpaceLightDir(float4 v) 模型空间中的顶点坐标==》世界空间中从这个点到光源的方向
float3 UnityWorldSpaceLightDir(float4 v) 世界空间中的顶点坐标==》世界空间中从这个点到光源的方向
float3 ObjSpaceLightDir(float4 v) 模型空间中的顶点坐标==》模型空间中从这个点到光源的方向
//方向转换
float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间==》世界空间
float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间=》世界空间