在 Shader 中,UV 坐标是用于对纹理(Texture)进行采样的二维坐标系统,核心作用是建立三维模型顶点与二维纹理像素之间的映射关系。
UV 坐标的取值范围通常是 0.0 ~ 1.0,是一个标准化的二维坐标系:
0 → 10 → 1(0,0) 位于纹理的左下角,(1,1) 位于纹理的右上角这个设计和图片的像素坐标(原点在左上角)不同,是图形学中的通用标准。
三维模型的每个顶点都会携带一组 UV 坐标,GPU 会根据顶点 UV 进行插值计算,最终为模型表面的每个像素分配对应的 UV 坐标,从而确定该像素应该采样纹理的哪个位置。
可以把 UV 坐标想象成纹理的"贴图纸坐标":
(0.5, 0.5),就表示采样纹理的正中心像素;如果是 (1.5, 0.5),则表示纹理水平重复一次后的中心位置(纹理重复采样)。在 GLSL 着色器中,UV 坐标通常由顶点着色器(Vertex Shader)传递给片段着色器(Fragment Shader),核心流程如下:
// 顶点着色器
varying vec2 vUv; // 传递给片段着色器的 UV 变量
void main() {
vUv = uv; // 直接传递
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
// 片段着色器
varying vec2 vUv; // 从顶点着色器传入的 UV 坐标
void main() {
gl_FragColor = vec4(vUv, 1.0, 1.0);
}
vUv * 5.0 会让纹理在横竖方向各重复 5 次。
vUv + vec2(0.2, 0.1) 会让纹理整体偏移。
vUv.x += uTime * 0.1。
gl_FragColor = vec4(vUv.x, vUv.y, 0.5, 1.0); // U→红,V→绿
1.0 - vUv.y 即可修正。
UV 坐标是纹理映射的基础,理解 UV 坐标的工作原理对于制作高质量 3D 模型和实现复杂着色器效果至关重要。