声明与绑定
在 Properties 中声明纹理
_MainTex ("Base Texture", 2D) = "white" {}
建议采用与大多数Shader相同的属性名称,如_MainTex,这样材质在更换Shader时,已设置的属性可继承到新Shader。
在 HLSL 中绑定纹理变量
sampler2D _MainTex;
float4 _MainTex_ST;_XXX_ST:Unity 自动为每个 2D 类型纹理添加 ST(Scale & Translation)变量,名称为 _XXX_ST。->[纹理变换 _XXX _ST](#纹理变换 _XXX _ST)
使用
纹理采样
tex2D
普通纹理采样
float4 tex2D(sampler2D tex, float2 uv)tex2Dlod
用指定 mip 采样纹理
float4 tex2Dlod(tex, float4 uv_lod)uv_lod结构:
- xy —— 纹理坐标
- z —— 不使用
- w —— LOD mip等级
tex2Dlod(_MainTex, float4(uv, 0, 2)); // 用 mip level 2 采样tex2Dbias
采样时使 mip 偏移
float4 tex2Dbias(tex, float4 uv_bias)uv_lod结构:
- xy —— 纹理坐标
- z —— 不使用
- w —— LOD mip偏移值
float4 col = tex2Dbias(_MainTex, float4(uv, 0, -1)); // 偏向更高一级分辨率 mip纹理变换 _XXX_ST
数据结构
_XXX_ST = float4(x: 缩放X, y: 缩放Y, z: 平移X, w: 平移Y)TRANSFORM_TEX
一个直接应用纹理变换的内置宏,可以直接对指定的纹理进行UV变换
#define TRANSFORM_TEX(texcoord, name) ((texcoord) * name##_ST.xy + name##_ST.zw)注意:传入的是纹理变量,不需要带_ST
float2 uv = TRANSFORM_TEX(uv, _MainTex);法线纹理
对于法线纹理,采样之后需要通过函数UnpackNormal解析
float3 UnpackNormal(fixed4 packedNormal)示例:
float3 normal = UnpackNormal(tex2D(_NormalMap, uv));