TRANSFORM_TEX

Shader "Custom/Exam1" {
Properties {
_MainTex ("Texture", 2D) = "white" { }
}
SubShader
{
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
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
}
}
}


float4 _MainTex_ST 中的_MainTex_ST变量也没有用到,为啥非要声明一下?
简单来说,TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算,确保材质球里的缩放和偏移设置是正确的。 (v.texcoord就是顶点的uv)

而_MainTex_ST的ST是应该是SamplerTexture的意思   就是声明_MainTex是一张采样图,也就是会进行UV运算。 百度搜索编、程、回、忆、录之unity3d, 如果没有这句话,是不能进行TRANSFORM_TEX的运算的。
如果Tiling 和Offset你留的是默认值,即Tiling为(1,1) Offset为(0,0)的时候,可以不用
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
换成o.uv = v.texcoord.xy;也是能正常显示的;相当于Tiling 为(1,1)Offset为(0,0)

posted @ 2016-08-24 16:30  00000000O  阅读(354)  评论(0编辑  收藏  举报