[Shader] Per-Fragment Operations 每个片段的操作

英文原文:https://en.wikibooks.org/wiki/Cg_Programming/Per-Fragment_Operations

  每个片段操作是图形管道的一部分,通常由一系列测试和操作组成,这些操作可以在将片段着色器生成的片段颜色写入帧缓冲区中的相应像素之前修改它。如果任何一个测试失败,该片段将被丢弃。(此规则的一个例外是模版测试(stencil test),可以配置它来更改像素的模版值,即使片段没有通过模版和/或深度测试。)

内容

  1. 概述
  2. 特定的每个片段操作
  3. 注意每个片段操作的顺序
  4. 每个片段操作的可编程性
  5. 进一步阅读

概述

在每个片段操作的概述中,蓝框表示数据,&&表示可配置的每个片段操作。

&& Fragment Data (Color and Depth) - 片段着色器的输出

Pixel Ownership Test (像素归属测试) - 通常不能由应用程序定制

Scissor Test (剪刀测试) - 如果片段在指定的(剪刀)矩形之外,则失败

Alpha Test - OpenGL ES 2.x中没有; 结果取决于片段的alpha值(不透明度),参考alpha值和配置的alpha测试

Stencil Test(模板测试) - 结果取决于模板缓冲区中对应像素处的值和配置的模板测试

Depth Test (深度测试) - 结果取决于片段的深度、对应像素处深度缓冲区的深度和配置的深度测试

Blending(混合) - 结果取决于片段颜色(包括其不透明度)、帧缓冲中对应像素的颜色和配置的混合方程

Dithering - 通常不能由应用程序定制

Logical Operations(逻辑运算) - OpenGL ES 2.x中没有; 结果取决于片段的颜色、帧缓冲区中对应像素的颜色和配置的逻辑(位)操作

Framebuffer (Color, Depth and Stencil Value) (帧缓冲(颜色,深度和模板值)) - 对于个别通道,可以禁用写入framebuffer


特定的每个片段操作

有些逐片段操作特别重要,因为它们已经建立了应用程序:

  • 深度测试 用于渲染不透明的 primitives (例如三角形),具有正确的遮挡。这是通过比较片段的深度与之前渲染的最前面的片段的深度来完成的,后者存储在深度缓冲区中。如果片元距离更远,则深度测试失败,片元将被丢弃。否则,该片元是新的最前端片元,其深度存储在深度缓冲区中。

  • 混合用于渲染半透明 primitives (玻璃、火、闪光等),通过混合(即合成)片段的颜色与已经存储在framebuffer中的颜色。这通常与禁止写入深度缓冲区相结合,以避免半透明primitives 遮挡其他 primitives 。

  • 模板测试 通常用于将渲染限制在屏幕的特定区域,例如,在3D场景中,镜子、窗口或更一般的“门户”。它对某些算法也有更高级的用途,例如影子体积。

  关于特定的每个片段操作的更多细节可以在特定于平台的教程中找到,因为这取决于平台以及操作的配置方式


注意每个片段操作的顺序

  虽然OpenGL和Direct3D等api的规范规定了每个片段操作的特定顺序,但gpu可以改变这些操作的顺序,只要这不会改变结果。事实上,gpu甚至会在执行片段着色器之前执行许多测试,只要这是可能的。在这种情况下,片段着色器不会为一个测试失败的片段执行。(一个例子是所谓的“早期深度测试”)这可以带来可观的性能提升。


per片段操作的可编程性

  per片段操作通常是可配置的,但不能编程,即各种测试可以以多种方式配置,但您不能编写程序来计算测试。然而,这种情况正在改变。例如,OpenGL ES 2.0没有提供alpha测试,因为同样的功能可以通过片段着色器中的条件丢弃操作来实现,这实际上是一个可编程的alpha测试。


进一步的阅读

  OpenGL ES 2.0的 per 片段操作在“OpenGL ES 2.0”的第4章中有详细的定义。可在“Khronos OpenGL ES API注册中心”获得。

  在Addison-Wesley出版的Aaftab Munshi、Dan Ginsburg和Dave Shreiner所著的《OpenGL ES 2.0编程指南》(OpenGL ES 2.0 Programming Guide)一书的第11章中给出了更容易理解的描述(见其网站)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值