声明与绑定

在 Properties 中声明纹理

SHADERLAB
_MainTex ("Base Texture", 2D) = "white" {}
点击展开查看更多

建议采用与大多数Shader相同的属性名称,如_MainTex,这样材质在更换Shader时,已设置的属性可继承到新Shader。

在 HLSL 中绑定纹理变量

HLSL
sampler2D _MainTex;
float4 _MainTex_ST;
点击展开查看更多

_XXX_ST:Unity 自动为每个 2D 类型纹理添加 ST(Scale & Translation)变量,名称为 _XXX_ST。->[纹理变换 _XXX _ST](#纹理变换 _XXX _ST)

使用

纹理采样

tex2D

普通纹理采样

HLSL
float4 tex2D(sampler2D tex, float2 uv)
点击展开查看更多

tex2Dlod

用指定 mip 采样纹理

HLSL
float4 tex2Dlod(tex, float4 uv_lod)
点击展开查看更多

uv_lod结构: - xy —— 纹理坐标 - z —— 不使用 - w —— LOD mip等级

HLSL
tex2Dlod(_MainTex, float4(uv, 0, 2)); // 用 mip level 2 采样
点击展开查看更多

tex2Dbias

采样时使 mip 偏移

HLSL
float4 tex2Dbias(tex, float4 uv_bias)
点击展开查看更多

uv_lod结构: - xy —— 纹理坐标 - z —— 不使用 - w —— LOD mip偏移值

HLSL
float4 col = tex2Dbias(_MainTex, float4(uv, 0, -1)); // 偏向更高一级分辨率 mip
点击展开查看更多

纹理变换 _XXX_ST

数据结构

HLSL
_XXX_ST = float4(x: 缩放X, y: 缩放Y, z: 平移X, w: 平移Y)
点击展开查看更多

TRANSFORM_TEX

一个直接应用纹理变换的内置宏,可以直接对指定的纹理进行UV变换

HLSL
#define TRANSFORM_TEX(texcoord, name) ((texcoord) * name##_ST.xy + name##_ST.zw)
点击展开查看更多

注意:传入的是纹理变量,不需要带_ST

HLSL
float2 uv = TRANSFORM_TEX(uv, _MainTex);
点击展开查看更多

法线纹理

对于法线纹理,采样之后需要通过函数UnpackNormal解析

HLSL
float3 UnpackNormal(fixed4 packedNormal)
点击展开查看更多

示例:

HLSL
float3 normal = UnpackNormal(tex2D(_NormalMap, uv));
点击展开查看更多

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/2d-%E7%BA%B9%E7%90%86built-in/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键