片段着色器会自动将颜色值限制在其范围内吗?

use*_*692 3 opengl fragment-shader

片段着色器会自动将颜色值限制在其范围内吗?

我需要显式地将着色器代码的值声明为蛤吗?如果不这样做,并且着色器自动进行钳位,是否意味着将节省一些处理时间?

Ret*_*adi 5

是的,如果颜色缓冲区为规范化的定点格式,它们会自动钳位。从OpenGL 3.3规范复制:

片段着色器写入的颜色值可以是浮点数,有符号整数或无符号整数。如果颜色缓冲区具有带符号或无符号的标准化定点格式,则假定颜色值是浮点的,并分别如公式2.6或2.4所述转换为定点;否则不应用类型转换。

参考部分“从浮点到归一化定点的转换”说(强调):

从浮点值f到相应的无符号归一化定点值c的转换是通过首先将f限制在[0,1]的范围内,然后...

如果您的帧缓冲区格式是归一化的定点类型(如典型的GL_RGBA8),则明确地夹紧片段着色器将浪费操作。着色器中的额外夹持操作很可能非常便宜,但肯定是不必要的。

如果使用浮点颜色缓冲区,情况将有所不同。如上面的规范报价所暗示的,在这种情况下不施加钳位。这是可以预期的,因为使用浮点颜色缓冲区的主要动机是拥有更大范围的值。浮点颜色缓冲器由渲染创建到FBO带有附件类型的GL_RGBA16FGL_RGBA32F或类似的。