这可能是比标题所暗示的更基本的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错误,但任何帮助都表示赞赏!
答案 0 :(得分:1)
我通过删除对glEnable(GL_DEPTH_TEST);
的调用解决了这个问题。
我怀疑通过启用深度测试,OpenGL会丢弃后续计算步骤中的片段,因为它们具有相同的深度值。