从应用程序传递到顶点函数的语义有 a2v:
POSITION 顶点坐标 (模型空间下)
NORMAL 法线 (模型空间下)
TANGENT 切线 模型空间下
TEXCOORD0~n 纹理坐标
COLOR 顶点颜色
从顶点函数传递给片元函数时候可以使用的语义:
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
COLOR0 可以传递一组值 4个 颜色
COLOR1 可以传递一组值 4个
TEXTCOORD0~7 传递纹理坐标
片元函数传递给系统:
SV_Target 颜色值,显示到屏幕上的颜色值
一些着色器的简单写法:
Shader"ff"{ SubShader{ Pass{ CGPROGRAM //顶点函数 这里只是声明了顶点函数的函数名 确定位置 //基本作用是完成顶点坐标从模型空间到剪裁空间(从游戏环境转换到视野相机屏幕上) #pragma vertex vert //片元函数 处理像素 返回颜色值 //基本作用 返回模型对应屏幕上的每一个像素的颜色值 #pragma fragment frag float4 vert(float4 v : POSITION) :SV_POSITION{//通过语义告诉系统参数的用处 , 比如POSITION是告诉系统我需要顶点坐标 //SV_POSITION 这个语意是返回给剪裁空间下的顶点坐标 return UnityObjectToClipPos(v);//把模型空间下的顶点信息转换到剪裁空间下 } fixed4 frag():SV_Target{ return fixed4(1,1,1,1); } ENDCG } } Fallback "VertexLit" }
第二种:
Shader"ff3" { SubShader{ Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag struct a2v { float4 vertex:POSITION;//告诉unity把模型空间下的顶点坐标填充给 vertex float3 normal:NORMAL;//告诉unity 把模型空间下的法线方向填充给normal float4 texcoord : TEXCOORD0;//告诉UNITY把第一套纹理坐标填充给texcoord }; struct v2f { float4 position : SV_POSITION; float3 temp:COLOR0;//这个语义可以由用户自己定义,一般用来存储颜色 }; v2f vert(a2v v) {//效果的计算放在顶点函数里 顶点之外的点是通过插值来计算的 性能高 但是效果一般 v2f f; f.position = UnityObjectToClipPos(v.vertex); f.temp = v.normal; return f; } fixed4 frag(v2f f) : SV_Target{ return fixed4(f.temp,0); } ENDCG } } Fallback "VertexLit" }