采样函数 :tex2D函数。
对一张贴图的采样范围 :(0~1)
位图 :
CG中,每有一个sampler2D(纹理),就会有一个uv坐标
位图的模式 :
Repeat :在左侧再拼接一个一样的图片
clamp :不重复
过滤模式 :
Billinear :会有两个颜色的混合
point(no fliter) :不会有两个颜色混合
在纹理采样时,对UV坐标的赋值,不要直接使用顶点坐标,否则Tiling(平铺) , offset(偏移量)会不起作用。如果想要使用平铺、偏移,那么,wrap Mode必须为repeat模式,Filter Mode --> Billnear
Unity为了方便,不用每一次都通过脚本进行赋值,提供了一个uv的缩放和偏移的四阶向量,叫做 _MainTex_ST。(_MainTex :属性块中声明的纹理名 ;必须要以_ST结尾)
顶点函数中,对uv坐标的赋值,不能直接使用顶点坐标 ;对uv坐标的赋值:Tilling用乘法,offset用加法。
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw ;
o.uv = TRANSFORM_TEX(v.texcoord , _MainTex) ; // 宏,这个宏的操作跟之前的赋值操作效果一样的
// 参数 :顶点中的贴图坐标 、 properties中声明的贴图的名称
appdata_base 这个顶点结构体中,只有一个textcoord纹理;
appdata_full 这个顶点结构体中,有多个纹理,当使用光照贴图的时候,必须使用这个结构体。
在片段函数中 :使用tex2D函数对贴图进行采样 :
fixed4 color = tex2D(_MainTex , IN.uv);
Shader "Custom/Texture" {
Properties
{
_MainTex("MainTex" , 2D) = "" {}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
// float tiling_x;
// float tiling_y;
// float offset_x;
// float offset_y;
struct v2f {
float4 pos : POSITION;
float4 uv : TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP , v.vertex);
// 对uv坐标的赋值,不要直接使用顶点坐标,否则Tilling(平铺) 、offset(偏移量) 不起作用
// o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw; // Tilling用乘法,Offset用加法
o.uv = TRANSFORM_TEX(v.texcoord , _MainTex) ; // 这个宏,与上面的操作一样
return o;
}
fixed4 frag(v2f IN) : COLOR
{
// tex2D函数,返回值类型是一个四阶的向量,有两个参数 :纹理、一个二维坐标
fixed4 color = tex2D(_MainTex , IN.uv);
return color;
}
ENDCG
}
}
}