Opengl 我的手动mipmap生成中的一个错误

Opengl 我的手动mipmap生成中的一个错误,opengl,graphics,glsl,shader,Opengl,Graphics,Glsl,Shader,我的代码工作正常,直到我开始添加一个新功能,该功能采用现有纹理并为其生成高mip级别。在这段代码之后,我根本不使用更高的mip级别,我将base和max mip级别设置为0,因此应该只使用原始纹理。然而,如果我使用下面的mip生成代码,我会得到错误的工件再说一遍,我甚至没有使用更高的mip级别,只是我生成了更高的mip级别这一事实似乎弄乱了最低的mip级别 glBindFramebuffer(GL_FRAMEBUFFER, workFrame) ; glUseProgram(ShaderProg

我的代码工作正常,直到我开始添加一个新功能,该功能采用现有纹理并为其生成高mip级别。在这段代码之后,我根本不使用更高的mip级别,我将base和max mip级别设置为0,因此应该只使用原始纹理。然而,如果我使用下面的mip生成代码,我会得到错误的工件再说一遍,我甚至没有使用更高的mip级别,只是我生成了更高的mip级别这一事实似乎弄乱了最低的mip级别

glBindFramebuffer(GL_FRAMEBUFFER, workFrame) ;
glUseProgram(ShaderPrograms.HiZData.theProgram);
glActiveTexture(GL_TEXTURE0 + ShaderPrograms.HiZData.Cache.lastMipBindingIndex);
glBindTexture(GL_TEXTURE_2D, worldDepth);
glDepthFunc(GL_ALWAYS);
for(int i = 1; i<numLevels; i++) {
    glViewport(0, 0, depthDims.get(i).x, depthDims.get(i).y);
    // bind next level for rendering but first restrict fetches only to previous level
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, i  - 1);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, i - 1);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, worldDepth, i);
    // draw full-screen quad
    Quad2D.renderFullScreenNDCquad();
}
glViewport(0, 0, Display.getWidth(), Display.getHeight());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);

为什么?

有一件事让我感到惊讶,那就是您将要渲染的纹理级别附加到
GL\u DEPTH\u ATTACHMENT
。那是故意的吗?如果是,是否在片段着色器中设置
gl_FragDepth
,以将所需值写入其中,即从上一个纹理级别采样获得的值?你确定你没有绑定到GL_COLOR_ATTACHMENT0的东西,并且意外地向它写入值吗?我最初也怀疑你使用了
glFramebufferTexture
,而不是更常见的(至少对我来说)
glFramebufferTexture2D
。但是在阅读了一些规范之后,我相信这两个应该是等价的。@RetoKoradi是的,gl_FragDepth是在片段着色器中设置的。此框架的颜色附件不受任何约束,但即使有,也无法解释我的错误。我也试过glFramebufferTexture2D,但也不起作用,我想你是对的,它们是等效的。@RetoKoradi我不知怎么修复了它。。但是怎么做呢?看看我的editSo,有一件事我没有看到一行为任何纹理图像分配存储空间;不是LOD 0或
numLevels-1
。包括对
glTexImage2D(…)
glTexStorage2D(…)
的任何相关调用。另外,
GL\u纹理\u基础\u级别
是一个采样参数;你不是在尝试这个纹理(我希望如此),只是在写它——所以这是不必要的。重要的是附加到FBO的图像LOD。
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);