TA学习之路——1.5纹理基础
1.纹理是什么?
宏观上来讲是一张图片
微观上来讲是一种可供着色器读写的结构化存储形式
imgage[Height][Width]
使用纹理的好处```
通过牺牲几何细节,使
1.建模工作量降低
2.存储空间减低
3.读取速度提高
2.纹理管线
模型空间->投影函数->纹理映射->纹理坐标->通讯函数->新纹理坐标->纹理采样(避免依赖纹理读取)->纹理值
3.纹理采样设置之Wrap Mode
决定UV值再[0,1]以外的表现
3.1 Repeat算法原理与实现
核心原理:纹理坐标通常归一化为 [0,1] 范围。重复算法通过取模运算将超出范围的坐标映射回有效区间,实现无缝平铺。
u r e a p e a t = u − ∣ u ∣ v r e a p e a t = v − ∣ v ∣ u _{reapeat} = u - |u| \\ v _{reapeat} =v- |v| \\ ureapeat=u−∣u∣vreapeat=v−∣v∣
其中u,v是原始纹理坐标,结果值始终在 [0,1]范围内。
Csharp代码:
internal class TextureRepeat
{
/// <summary>
/// 实现纹理坐标的重复平铺
/// </summary>
/// <param name="u">原始U坐标</param>
/// <param name="v">原始V坐标</param>
/// <param name="tileCount">平铺次数(默认为1,即不缩放)</param>
/// <returns>处理后的UV坐标</returns>
public static (float u, float v) RepeatUV(float u, float v, float tileCount = 1f)
{
// 缩放坐标以实现平铺次数
u *= tileCount;
v *= tileCount;
// 使用取模运算确保坐标在[0,1)范围
return (
u - MathF.Floor(u), // 等效于 u % 1.0
v - MathF.Floor(v) // 支持正负坐标自动循环
);
}
}
测试验证代码:
var uv1 = TextureRepeat.RepeatUV(1.3f, -0.2f);
Console.WriteLine($"Input (1.3, -0.2) → Output {
uv1}"); // (0.3, 0.8)
var uv2 = TextureRepeat.RepeatUV(2.5f, 3.7f, 2f); // 平铺2次
Console.WriteLine($"Tiled (2.5,3.7)x2 → {
uv2}"); // (0, 0.4)
3.2 Mirror算法原理与实现
纹理镜像(Mirror)是一种纹理寻址模式,通过对称翻转的方式平铺纹理,使相邻区域的纹理呈现镜像对称效果。与简单的重复(Repeat)不同,镜像模式在超出 [0,1] 范围的坐标处对纹理进行交替翻转,常用于消除单调重复感并保持视觉连续性。
核心原理
坐标映射规则:通过判断坐标的整数部分是否为奇数,决定是否翻转坐标。