Cg 编程/逐片段操作
逐片段操作是 图形管道 的一部分,通常包含一系列测试和操作,这些测试和操作可以在片段着色器生成的片段颜色写入帧缓冲区中对应的像素之前修改它。如果任何测试失败,则该片段将被丢弃。(此规则的一个例外是模板测试,它可以配置为即使片段未通过模板和/或深度测试,也可以更改像素的模板值。)
在逐片段操作的概述中,蓝色方框代表数据,灰色方框代表可配置的逐片段操作。
片段数据(颜色和深度) | 片段着色器的输出 | |||
↓ | ||||
像素所有权测试 | 通常不能由应用程序自定义 | |||
↓ | ||||
剪切测试 | 如果片段位于指定(剪切)矩形之外,则失败 | |||
↓ | ||||
Alpha 测试 | 不在 OpenGL ES 2.x 中;结果取决于片段的 alpha 值(不透明度)、参考 alpha 值和配置的 alpha 测试 | |||
↓ | ||||
模板测试 | 结果取决于相应像素在模板缓冲区中的值和配置的模板测试 | |||
↓ | ||||
深度测试 | 结果取决于片段的深度、相应像素在深度缓冲区中的深度以及配置的深度测试 | |||
↓ | ||||
混合 | 结果取决于片段颜色(包括其不透明度)、帧缓冲区中相应像素的颜色以及配置的混合方程 | |||
↓ | ||||
抖动 | 通常不能由应用程序自定义 | |||
↓ | ||||
逻辑运算 | 不在 OpenGL ES 2.x 中;结果取决于片段的颜色、帧缓冲区中相应像素的颜色以及配置的逻辑(按位)运算 | |||
↓ | ||||
帧缓冲区(颜色、深度和模板值) | 可以禁用对帧缓冲区的写入,以针对各个通道 |
一些逐片段操作特别重要,因为它们有已建立的应用程序
- 深度测试用于以正确的遮挡渲染不透明的图元(例如三角形)。这是通过将片段的深度与先前渲染的最前端片段的深度进行比较来实现的,该深度存储在深度缓冲区中。如果片段更远,则深度测试失败,该片段将被丢弃。否则,该片段将成为新的最前端片段,其深度将存储在深度缓冲区中。
- 混合用于通过混合(即合成)片段的颜色与已存储在帧缓冲区中的颜色来渲染半透明图元(玻璃、火焰、光晕等)。这通常与禁用写入深度缓冲区相结合,以避免半透明图元遮挡其他图元。
- 模板测试通常用于将渲染限制在屏幕的某些区域,例如镜子、窗口或 3D 场景中更一般的“门户”。它在某些算法中也有更高级的用途,例如阴影体积。
有关特定逐片段操作的更多详细信息,请参阅特定于平台的教程,因为它取决于平台以及操作的配置方式。
虽然 OpenGL 和 Direct3D 等 API 的规范对逐片段操作施加了特定的顺序,但 GPU 可以在不改变结果的情况下更改这些操作的顺序。事实上,只要有可能,GPU 会在执行片段着色器之前执行许多测试。在这种情况下,对于已通过其中一项测试失败的片段,不会执行片段着色器。(一个例子是所谓的“早期深度测试”。)这可以带来可观的性能提升。
逐片段操作通常是可配置的,但不可编程,即可以以多种方式配置各种测试,但不能编写程序来计算这些测试。但是,这种情况正在发生变化。例如,OpenGL ES 2.0 不提供 alpha 测试,因为可以在片段着色器中通过条件丢弃操作实现相同的功能,这实际上是一个可编程的 alpha 测试。
OpenGL ES 2.0 的逐片段操作在“OpenGL ES 2.0.x 规范”第 4 章中进行了详细定义,可在 “Khronos OpenGL ES API 注册表” 中获取。
Aaftab Munshi、Dan Ginsburg 和 Dave Shreiner 在 Addison-Wesley 出版的一本书“OpenGL ES 2.0 编程指南”第 11 章中给出了更易于理解的描述(请参阅 其网站)。
< Cg 编程