OpenGL乒乓球一次通过,而不是两次

时间:2017-12-19 18:20:09

标签: c++ opengl

这可能是比标题所暗示的更基本的OpenGL错误。

我正在使用OpenGL中的片段着色器进行分割,这需要多次渲染过程来进行连续操作(例如高斯模糊+边缘检测+分割)。

据我所知,有一种称为ping pong的常用技术,它采用两个帧缓冲区(FBO),并简单地使用另一个FBO作为输入呈现给一个FBO。

问题是,一次传递 - shader_0 使用 FBO_0 作为输入将内容输出到 FBO_1 - 工作正常,但是当我尝试使用 shader_1 FBO_0 作为输入并渲染到 FBO_1 ,我得到一个完全透明的图像

我检查了两个着色器并且它们确实单独工作,但它们一起产生了这个透明输出。

以下是我为每次传递做的调用集,其中segmentationBuffers包含两个FBO,分别用作此传递的输入和输出:

glBindFramebuffer(
    GL_FRAMEBUFFER,
    segmentationBuffers[lastSegmentationFboRenderedTo]->FramebufferName
);
glViewport(0, 0, windowWidth, windowHeight);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

currentStepShader->UseProgram();

glClearColor(0, 0, 0, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Enable blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

lastSegmentationFboRenderedTo = (lastSegmentationFboRenderedTo + 1) % 2;

glActiveTexture(GL_TEXTURE0);
glBindTexture(
    GL_TEXTURE_2D,
    segmentationBuffers[lastSegmentationFboRenderedTo]->renderedTexture
);
glUniform1i(glGetUniformLocation(shader->shaderPtr, "inputTexture"), 0);
glUniform2fv(
    glGetUniformLocation(shader->shaderPtr, "texCoordOffsets"),
    25,
    texCoordOffsets
);

quad->Draw(GL_TRIANGLES, shader,
    orthographicProjection,
    glm::mat4(1.0f),
    getOverlayModelMatrix()
);

如上所述,执行一次传递会产生正确的中间结果,但连续执行两次会产生透明帧。我怀疑这是一个比看起来更基本的OpenGL错误,但任何帮助都表示赞赏!

1 个答案:

答案 0 :(得分:1)

我通过删除对glEnable(GL_DEPTH_TEST);的调用解决了这个问题。

我怀疑通过启用深度测试,OpenGL会丢弃后续计算步骤中的片段,因为它们具有相同的深度值。