在图形渲染管线中,“frag”(或 “fragment”)被称为片元着色器,主要是因为它处理的单位是"片元"(Fragment)。以下是关键原因:
- 片元的本质:
- 片元是光栅化后生成的潜在像素(尚未通过深度测试/模板测试等)
- 每个片元包含颜色、深度、纹理坐标等属性,但还不是最终像素
- 着色器分工:
// 顶点着色器处理顶点
void vert() { … }
// 片元着色器处理片元
void frag() { … }
顶点着色器处理几何数据,而片元着色器专门处理光栅化后的片元数据
3. 核心职责:
- 计算每个片元的最终颜色(通过纹理采样、光照计算等)
- 可丢弃片元(通过
"discard"操作) - 输出到多个渲染目标(MRT)
- 与像素的区别:
- 一个屏幕像素可能对应多个片元(如透明物体重叠时)
- 片元需要经过一系列测试才能成为最终像素
- 历史沿革:OpenGL 2.0 时代开始明确区分"顶点处理器"和"片元处理器",Direct3D 称之为"像素着色器",但现代图形API(如Vulkan)都统一采用更准确的"片元着色器"术语
典型片元着色器示例(GLSL):
#version 450
in vec2 uv;
uniform sampler2D tex;
out vec4 fragColor;
void main() {
fragColor = texture(tex, uv);
// 这个片元可能最终不会显示在屏幕上
// 取决于后续的深度测试、混合等操作
}
这种命名方式强调了图形管线中"片元"这一中间状态的重要性,比"像素着色器"的表述更准确反映其实际工作阶段。