Cg Programming/Per-Fragment Operations逐片元操作

时间:2024-04-03 19:44:33

逐片元操作是图形管线的一部分,它通常包含一系列测试和操作,可以在写入帧缓冲中相应像素之前修改由片元着色器生成的片元颜色。如果测试的任意一步失败了,该片元就会被丢弃掉。(该规则的一个例外就是模板测试,即使片元没有通过模板或深度测试它也会被配置来改变像素值。)

概览

在逐像素操作概览中,蓝色方格表示数据,灰色方格表示可配置的逐片元操作。
Cg Programming/Per-Fragment Operations逐片元操作

指定逐片元操作

一些逐片元操作特别重要因为它们建立了应用程序:

  • 深度测试被用来渲染有正确遮挡的不透明图元(如三角形)。它通过比较一个片元和之前深度缓冲中被渲染片元的深度来完成。如果片元离得比较远,深度测试就会失败,片元会被丢弃。否则片元会成为最新的片元,而且它的深度会被存储在深度缓冲中。
  • 通过混合(组合)片元的颜色和已经存储在帧缓冲中的颜色,混合被用来渲染半透明图元(玻璃、火焰、耀斑等)。它通常组合使用禁止写入深度缓冲来避免半透明图元遮挡其它图元。
  • 模板测试经常被用来限制屏幕某块区域的渲染,比如一块镜子、一个窗口或者3D场景中的一个常见“入口”。对于某些算法它也有一些高级应用,比如体积阴影。
    更多关于特定逐片元操作的细节可以在平台特定的教程中找到,因为它取决于平台,这些操作是如何配置的。

注意逐片元操作的顺序

既然像OpenGL和Direct3D这些API加入了某些逐片元操作的顺序,GPU就能改变这些操作的顺序只要它不改变结果。实际上,GPU将会尽可能地在片元着色器执行之前执行大多数测试。在这种情况下,一个片元没有通过其中一个测试,片元着色器就不会执行。(一个例子就是所谓的“早期深度测试。”)这会导致可观的性能提升。

逐片元操作的可编程性

逐片元操作通常是可配置的但不是可编程的,也就是可以通过多种方法配置各种测试,但你不能编写程序来计算测试。但是,这种情况正在改变。举例来说,OpenGL ES 2.0没有提供alpha测试因为相同的功能可以通过片元着色器中有条件地放弃操作来实现,实际上是可编程的alpha测试。