获取GL_FRAMEBUFFER_INCOMPLETE_MISSING_ ATTACHMENT带有深度纹理



我一直在尝试实现阴影映射很长时间了,我正在使用Lance Williams的技术(它将两次呈现现场,一次是在光线空间中,一次在视图空间中(。但是,当我在GL_FRAMEBUFFER上调用glCheckFramebufferStatus时,我在之后获得GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT我在其上拨打了glFramebufferTexture2D。我很困惑,因为当没有纹理或渲染扣时,该错误被丢弃了,但我认为我 do 都附加了纹理。

这是我的代码在init中运行:

    gl.glEnable(GL2.GL_TEXTURE_2D);
    // generate stuff
    IntBuffer ib = IntBuffer.allocate(1);
    gl.glGenFramebuffers(1, ib);
    frameBuffer = ib.get(0);
    gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, frameBuffer);
    ib = IntBuffer.allocate(1);
    gl.glGenTextures(1, ib);
    depthTexture = ib.get(0);
    gl.glBindTexture(GL2.GL_TEXTURE, depthTexture);
    // prevents 'shadow acne'
    gl.glPolygonOffset(2.5f, 0);
    // prevents multiple shadows
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_EDGE);
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_EDGE);
    // prevents (or expects!!!) pixel-y textures
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST);
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST);
    // store one value in all four components of pixel
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY);
    gl.glFramebufferTexture2D(GL2.GL_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, GL2.GL_TEXTURE_2D, depthTexture, 0);
    gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_DEPTH_COMPONENT16, 1024, 1024, 0, GL2.GL_DEPTH_COMPONENT, GL2.GL_FLOAT, null);
    gl.glDrawBuffer(GL2.GL_NONE);
    gl.glReadBuffer(GL2.GL_NONE);
    int FBOStatus = gl.glCheckFramebufferStatus(GL2.GL_FRAMEBUFFER);
    // FBOStatus == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT

edit :我也在一个实际的空项目中运行了此方法(投掷错误(

,但我认为我确实有一个纹理。

不,你没有。

因为

gl.glBindTexture(GL2.GL_TEXTURE, depthTexture);

只会生成GL_INVALID_ENUM错误,因为您在这里表示GL_TEXTURE_2D,您只有一个纹理对象的名称,并且永远不会为此创建纹理存储。您的glTexImage2D调用只会影响一些其他纹理对象,这些对象恰好在当时绑定(甚至是遗产GL中的纹理对象0(。

相关内容

  • 没有找到相关文章

最新更新