You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:36:10