当颜色超出范围时,在颜色混合期间会发生什么

时间:2017-11-22 08:12:11

标签: opengl blending

假设我有这样的混合方程和系数,颜色超出范围,例如

Source color: (0.8f, 0.8f, 0.8f, 1.0)
Destination color: (0.8f, 0.8f, 0.8f, 1.0) 
glBlendFunc(GL_ONE, GL_ONE);
glBlendEquation(GL_FUNC_ADD);

计算后颜色是否应该标准化还是被钳制? GL标准定义的是什么,我无法找到它。

1 个答案:

答案 0 :(得分:1)

通常,颜色矢量永远不会在GL中自动“标准化”。如果该操作对于颜色缓冲区的当前格式有意义,则它们被钳制在各个片段处理阶段,并且在使用浮点格式时它们从不被钳制。

OpenGL 4.6 Core Profile specification

第17.3.6节混合:

  

如果颜色缓冲区是定点的,则源和的组件   目标值和混合因子各自被钳制到[0,1]或   [-1,1]分别用于无符号归一化或有符号归一化   在评估混合方程之前的颜色缓冲区。如果颜色   缓冲区是浮点数,不会发生钳位。 由此产生的四个   值将被发送到下一个操作。

因此,如果启用了混合,则除非使用非标准化浮点颜色缓冲区,否则输入值将被限制。混合的结果没有被限制。

接下来的操作是 第17.3.7节sRGB转换

  

[注意:cl是操作的输入值(混合阶段的结果值),cs是sRGB转换的结果值,{{1} }如果禁用sRGB转换]

     

R,G和B的结果cs = cl值以及未修改的A形成新的RGBA颜色值。 如果颜色缓冲区是定点的,则每个组件都被夹紧   到范围[0,1],然后使用公式2.3转换为定点值。结果四个值被发送到随后的抖动操作。