在这个案例中,我们将通过一个简单的垂直渐变,学习 GLSL 中位置与颜色的关系。你将掌握如何将屏幕坐标转为归一化 UV,并将其映射为像素颜色。
---
- 理解如何通过 gl_FragCoord
获取当前像素位置
- 掌握坐标归一化方法,构造标准 UV 坐标系
- 将位置数据映射为颜色强度,生成渐变视觉效果
- 熟悉 vec4
色彩向量的构造与使用
---
在片元着色器中,每个像素都有一个固定的位置坐标,使用 gl_FragCoord.xy
获取,单位是像素。
`
glsl
vec2 pos = gl_FragCoord.xy;
`
这一步告诉我们:着色器是以“像素为单位”进行渲染的。
---
不同设备分辨率不同,为了统一处理逻辑,我们通常将像素坐标转换成 0~1 范围的比例坐标,即 UV。
做法是:将每个像素的位置除以画布总尺寸(用 u_resolution
传入)。
`
glsl
vec2 uv = gl_FragCoord.xy / u_resolution.xy;
`
- 左下角的 UV 是 (0.0, 0.0)
- 右上角的 UV 是 (1.0, 1.0)
UV 坐标是图形学中非常基础、非常关键的概念。
---
将 UV 坐标的某个分量映射为颜色的某个通道,就能根据像素位置制造出颜色渐变。
- uv.y
表示垂直方向上的归一化位置(从下 0 到上 1);
- 如果将 uv.y
的值赋给蓝色通道,会得到一个从下到上逐渐变蓝的 垂直渐变;
- 如果改为使用 uv.x
,颜色变化将从左到右,形成 水平渐变。
你还可以使用更复杂的组合,例如 (uv.x + uv.y) / 2.0
,实现对角线渐变。这种方式将空间位置数据映射为颜色,是构建视觉图像的基础技巧。
---
在 GLSL 中,颜色使用 vec4
表示:分别对应 R(红)、G(绿)、B(蓝)和 A(不透明度)。
`
glsl
vec4 color = vec4(R, G, B, A);
gl_FragColor = color;
`
每个通道的值范围是 0.0
到 1.0
。例如,当蓝色通道设置为 uv.y
时,就会随着 y 值增加而变蓝。
---
请根据上面的知识点,尝试实现一个从白色逐渐变为蓝色的垂直渐变:
1. 使用 gl_FragCoord.xy
获取像素位置
2. 使用 u_resolution
将其归一化为 uv
3. 取 uv.y
作为蓝色通道值
4. 保持红色和绿色为常量
5. 使用 vec4
构造颜色,并输出到 gl_FragColor
---
| 名称 | 类型 | 说明 |
|-------------------|----------|------------------------------------------|
| gl_FragCoord
| vec4
| 当前片元的屏幕像素坐标(单位:像素) |
| u_resolution
| vec2
| 画布分辨率,由外部传入 |
| vec2(x, y)
| vec2
| 二维向量,用于表示坐标 |
| vec4(r, g, b, a)
| vec4
| 四维颜色向量,R/G/B/A 分别代表颜色通道 |
| /
| 运算符 | 用于坐标归一化处理 |
---