OpenGL计算着色器无法读取FBO深度纹理问题排查
OpenGL FBO深度纹理在计算着色器中全黑问题
我创建了绑定颜色缓冲纹理与深度缓冲纹理的FBO,渲染场景后颜色纹理可正常读取,但在计算着色器中使用深度纹理时显示全黑。即使在片段着色器中设置DepthTexture=0.5,也未出现预期的灰色画面。此前尝试阴影映射时也遇到类似无法可视化深度图的问题,参考相关解决方案后仍未解决。
编辑补充:已解决问题,此前未了解需通过glActivateTexture激活采样器并使用glUniform1i设置采样器单元。
Frame Buffer生成代码
glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glGenTextures(1, &ColorTexture); glBindTexture(GL_TEXTURE_2D, ColorTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, WINDOW_WIDTH, WINDOW_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ColorTexture, 0); glGenTextures(1, &DepthBuffer); glBindTexture(GL_TEXTURE_2D, DepthBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, WINDOW_WIDTH, WINDOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, DepthBuffer, 0); const GLenum buffers[]{ GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, buffers); if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { printf("FrameBuffer is incomplete!\n"); exit(1); } glBindFramebuffer(GL_FRAMEBUFFER, 0);
计算着色器代码
#version 450 layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in; layout(rgba8, binding = 0) uniform readonly image2D ColorImage; layout(r8, binding = 1) uniform readonly image2D DepthImage; // layout(binding = 1) uniform smapler2D DepthImage; layout(rgba8, binding = 2) uniform writeonly image2D OutputImage; vec4 color; ivec2 position; void main() { position = ivec2(gl_GlobalInvocationID.xy); color = imageLoad(DepthImage, position.xy); imageStore(OutputImage, position, vec4(vec3(color.r), 1.0)); }
片段着色器代码
#version 330 in vec4 Color; in vec2 TexCoord; uniform sampler2D uSampler; uniform int textured; layout (location = 0) out vec4 ColorTexture; layout (location = 1) out float DepthTexture; vec4 texColor; void main() { if(textured == 1) { ColorTexture = Color * texture2D(uSampler, TexCoord); } else { ColorTexture = Color; } DepthTexture = 0.5;//gl_FragCoord.z; }
输出纹理读取代码
glGenTextures(1, &outputImageID); glBindTexture(GL_TEXTURE_2D, outputImageID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, WINDOW_WIDTH, WINDOW_HEIGHT, 0, GL_RGBA, GL_FLOAT, nullptr); glBindImageTexture(2, outputImageID, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F); glUniform1i(glGetUniformLocation(ComputeShader->data.program, "OutputImage"), 2);
渲染循环代码
glBindFramebuffer(GL_FRAMEBUFFER, scene -> framebuffer); // rendering each object here glBindFramebuffer(GL_FRAMEBUFFER, 0); sh = scene -> ComputeShader; glUseProgram(sh -> data.program); glEnable(GL_DEPTH_TEST); glBindImageTexture(0,ColorTexture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8); glUniform1i(glGetUniformLocation(ComputeShader, "ColorImage"), 0); glBindImageTexture(1, DepthBuffer, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8); glUniform1i(glGetUniformLocation(ComputeShader, "DepthImage"), 1); glDispatchCompute(800/16, 600/16, 1); glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); // then I bind my normal shader for object rendering and render a quad.
内容的提问来源于stack exchange,提问作者Nandu Krishna
相关产品推荐
相关产品推荐

