【发布时间】:2019-02-25 20:05:05
【问题描述】:
程序将一堆东西渲染到一个中间帧缓冲区中,该缓冲区使用无符号规范化纹理来存储数据。中间帧缓冲区与默认帧缓冲区混合。用于渲染与帧缓冲区 0 混合的中间体的像素着色器如下:
#version 300 es
precision mediump float;
out vec4 fragColor;
in vec2 texCoords;
uniform sampler2D textureToDraw;
void main()
{
vec4 sampleColor = texture(textureToDraw, texCoords);
fragColor = vec4(sampleColor.rgb * -1.0, sampleColor.a);
}
设置draw到framebuffer 0的代码如下:
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// Draw the intermediate using the pixel shader above and a quad
fragColor 的 rgb 分量将在 [-1, 0] 范围内。预期的结果是从先前的帧缓冲区内容中减去中间颜色。实际结果是黑色与帧缓冲区为 0 的正确 alpha 混合,这表明 fragColor 在某处被钳制为 [0, 1] 并且负部分被丢弃。
有没有办法禁用片段着色器输出到 [0, 1] 的钳位?
我知道没有办法渲染到已签名的规范化纹理,因此可能存在 OpenGL 限制来阻止这种情况。我正在考虑的替代方案是进行两次渲染,一次将负位渲染到中间,另一个将正位渲染到另一个中间。最后,将正面与GL_FUNC_ADD 混合,将负面与GL_FUNC_REVERSE_SUBTRACT 混合。维护起来既慢又麻烦。有没有其他办法?
【问题讨论】:
标签: opengl-es framebuffer blending