TL;DR:在什么情况下(启用标志和渲染缓冲区类型(特别是 RGBA_F32)),当启用混合时,什么值被限制?
我发现的夹紧机制:
glClampColor):这似乎是控制glReadPixels,但有扩展标志 GL_CLAMP_VERTEX_COLOR,GL_CLAMP_FRAGMENT_COLOR可以做“某事”。据我所知,从扩展规范中可以看出,它们会限制顶点或片段着色器的输出。glBlendFunc:“所有比例因子的范围为 [0,1]。 ”这是否意味着源和目标因子在等式发生之前被钳位?glBlendEquation:“对于这些方程,所有颜色分量都被理解为具有 [0,1] 范围内的值。 ”这是否意味着源颜色和目标颜色在方程发生之前被钳位?在我对 RGBA_F32 渲染目标的实验中,这些钳位模式都没有发生(我通过使用 读回渲染目标的值来确认这一点glGetTexImage)。我最好需要(3)发生,但我要求对文档进行澄清,以便我自己弄清楚。
您引用的部分内容非常古老,可能是混淆的根源。我将从现代GL的角度来看你的观点,我将为此引用OpenGL 4.5 核心配置文件规范。但是,这些都不是特定于 OpenGL 4.x 的。从 GL 3.2 核心开始,这基本上没有变化。
1. glClampColor()唯一剩下的功能是在 期间夹紧glReadPixels。引用第 680 页的规范:
请注意,不推荐使用
FrontFace和ClampColor命令,因为它们仍然影响其他不推荐使用的功能;但是,ClampColor目标CLAMP_VERTEX_COLOR和CLAMP_FRAGMENT_COLOR已被弃用。”
限制顶点着色器输出仅对已弃用的内置变量(如gl_FrontColor,gl_BackColor等等)有意义。那些只需要模拟固定函数顶点处理,根本就不是一个好主意。对于通用输出,GL 没有机会知道哪些值是颜色,哪些不是。
2.片段着色器的情况类似。使用现代渲染方法,输出不一定是颜色,而是代表通用数据,因此隐式限制值是有害的。如果需要,您始终可以手动钳制着色器中的值。
来自规范 Reto Koradi 的回答的引用在 GL 4.5 规范中没有变化。仅当相应的渲染目标为定点或整数格式时,着色器输出才会被限制。
3.,4. 5.这些文件已经过时。GL 规范在第 17.3.8 节中对此进行了说明:
如果颜色缓冲区是定点的,源值和目标值的分量以及混合因子都被限制为 [0; 1] 或 [-1; 1] 在评估混合方程之前分别用于无符号归一化或有符号归一化颜色缓冲区。如果颜色缓冲区是浮点数,则不会发生钳位。产生的四个值被发送到下一个操作。混合仅适用于颜色缓冲区具有定点或浮点格式的情况。如果颜色缓冲区具有整数格式,则继续下一步操作。
混合结果的钳制发生在下一步,该步骤处理可选的 sRGB 转换(但是,钳制步骤与 sRGB 转换无关)。引用第 17.3.9 节:
R、G 和 B 的结果 cs 值以及未修改的 A 形成新的 RGBA 颜色值。如果颜色缓冲区是定点的,则每个分量都被限制在范围 [0; 1],然后使用公式 2.3 转换为定点值。产生的四个值被发送到后续的抖动操作。
所以是的,当使用GL_RGBA32F帧缓冲区时,根本不会发生隐式钳位。实际上,这是通用情况下唯一有用的操作模式。如果您需要在第 3 步进行一些限制:只需在将因子发送到glBlendFunc().