片段着色器会自动将颜色值限制在其范围内吗?
我是否需要显式地将值放入着色器代码中?
如果我不这样做,并且着色器会自动进行钳位,这是否意味着它将节省一些处理时间?
是的,如果颜色缓冲区采用标准化定点格式,它们会自动夹紧。从 OpenGL 3.3 规范复制:
片段着色器写入的颜色值可以是浮点型、有符号整数或无符号整数。如果颜色缓冲区具有有符号或无符号归一化定点格式,则颜色值被假定为浮点并转换为定点,分别如公式 2.6 或 2.4 中所述;否则不应用类型转换。
引用的“从浮点到标准化定点的转换”部分说(添加了强调):
从浮点值 f 到相应的无符号标准化定点值 c 的转换定义为首先将 f 限制在 [0, 1] 范围内, 然后 ...
如果您的帧缓冲区格式是标准化定点类型(如典型的GL_RGBA8
)。着色器中的额外钳位操作很可能非常便宜,但肯定是不必要的。
如果您使用浮点颜色缓冲区,情况会有所不同。正如上面的规格报价所暗示的,在这种情况下不应用钳位。这是预料之中的,因为使用浮点颜色缓冲区的一个主要动机是拥有扩展的值范围。浮点颜色缓冲区是通过渲染到附件类型为 FBO 来创建的GL_RGBA16F
, GL_RGBA32F
,或类似的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)