cube上显示一张贴图

来源:互联网 发布:centos查看gcc 编辑:程序博客网 时间:2024/05/29 04:43
Shader "Custom/testShader" {
properties{
  _MainTex("shitTexture",2D)="white"{}        //定义的材质参数
}
subshader
{   pass
      {
       CGPROGRAM
       #pragma vertex vert
       #pragma fragment frag
       #include "UnityCG.cginc"

       sampler2D _MainTex;         //需要重新声明一下Properties里面的
       float4 _MainTex_ST;

       struct v2f
       {
          float4 pos:SV_POSITION;
          float2 uv:TEXCOORD0;
       };

       v2f vert(appdata_base v)
       {
          v2f o;
          o.pos = mul(UNITY_MATRIX_MVP, v.vertex);             //视口的位置
          o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);       //贴图纹理坐标
          return o;
       }

       float4 frag(v2f i):COLOR                              //输出每个像素点的颜色值
       {
          float4 texCol = tex2D(_MainTex, i.uv);      //本像素取得的贴图颜色值
          float4 outp = texCol;
          return outp;
       }
       ENDCG
    }
}

}



【附】

关于_MainTex_ST的疑惑:  

(1)TRANSFORM_TEX是做什么的?

(2)为什么要声明_MainTex_ST?


答:1)TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset做运算,确保材质球里的缩放和偏移设       置是正确的。(v.texcoord就是顶点的uv)。

     o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

     o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;  二者等价

   2)_MainTex_ST的ST是Sample Texture的意思,就是声明一张采样图,如果没有就执行不了TRANSFORM_TEX,

     _MainTex_ST.xy 代表Tiling, _MainTex_ST.zw代表Offset。

     默认值Tiling为(1,1),Offset为(0,0),此时可省略不写,直接o.uv = v.texcoord.xy;

0 0