Vertex&Frag 类型的Shader采用的是顶点计算和像素计算的着色器方式。
如下图:先通过顶点着色器,计算模型的坐标和纹理,再传入像素着色器计算颜色值。
*注意
_MainTex_ST 和 TransForm_Tex 是对应关系,计算纹理坐标的偏移和平铺。
裁剪空间的范围是[-1,1],也就是在经过MVP矩阵后,o.pos.x/ o.pos.w 以及o.pos.y/ o.pos.w 的范围都是[-1,1] 故可以将裁剪空间坐标转换为 相对屏幕位置的uv坐标,如下o.uv = float2(( o.pos.x/o.pos.w+1)*0.5,(o.pos.y/o.pos.w+1)*0.5);
源代码:
1 Shader "JQM/VertexAndFrag" //文件名和路径 2 { 3 Properties //属性 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 } 7 SubShader 8 { 9 10 Pass 11 { 12 CGPROGRAM //Vertex&Frag 类型的shader 采用Cg语言 13 #pragma vertex vert 14 #pragma fragment frag 15 16 #include "UnityCG.cginc" 17 18 sampler2D _MainTex; //属性声明 19 float4 _MainTex_ST; 20 21 struct appdata 22 { 23 float4 vertex : POSITION; 24 float2 uv : TEXCOORD0; 25 }; 26 27 struct v2f 28 { 29 float4 pos:SV_POSITION; 30 float2 uv : TEXCOORD0; 31 }; 32 33 34 v2f vert (appdata v) //顶点程序 35 { 36 v2f o; 37 o.pos = mul(UNITY_MATRIX_MVP, v.vertex); //模型视图投影矩阵,将模型坐标转到摄像机坐标,在投影到屏幕的坐标 38 o.uv = TRANSFORM_TEX(v.uv, _MainTex); //计算UV和贴图之间的值 39 return o; 40 } 41 42 fixed4 frag (v2f i) : COLOR //片段程序,强制返回Color类型的颜色值 43 { 44 // sample the texture 45 fixed4 col = tex2D(_MainTex, i.uv); //纹理采样 46 return col; 47 } 48 ENDCG 49 } 50 } 51 }
时间: 2024-10-02 21:16:56