使用深度纹理获取 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT [关闭]

Posted

技术标签:

【中文标题】使用深度纹理获取 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT [关闭]【英文标题】:Getting GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT with depth texturing [closed] 【发布时间】:2017-06-28 18:53:25 【问题描述】:

长期以来,我一直在尝试实现阴影映射,并且我正在使用 Lance Williams 的技术(该技术将场景渲染两次,一次在光空间中,一次在视图空间中)。但是,当我在GL_FRAMEBUFFER 上调用glCheckFramebufferStatus 时,我得到GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT之后我已经调用了glFramebufferTexture2D。我很困惑,因为当帧缓冲区没有附加纹理或渲染缓冲区时会引发该错误,但我认为我确实有附加纹理。

这是我在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

编辑:我也在一个几乎空的项目中运行了这个方法(抛出错误)

【问题讨论】:

(GL2.GL_TEXTURE_2D, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY) 是什么意思?你如何使用INTENSITY 作为模式? 它应该将输出向量的所有四个分量设置为一个值。 【参考方案1】:

但我认为我确实附有纹理。

不,你没有。

自从

gl.glBindTexture(GL2.GL_TEXTURE, depthTexture);

只会产生一个GL_INVALID_ENUM 错误,因为你在这里指的是GL_TEXTURE_2D,你只有一个纹理对象的名称,并且从未为此创建纹理存储。您的 glTexImage2D 调用只会影响当时恰好绑定的其他一些纹理对象(甚至是旧版 GL 中的纹理对象 0)。

【讨论】:

这省去了很多精神上的痛苦

以上是关于使用深度纹理获取 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

unity urp 获取屏幕深度法向颜色纹理以及从深度纹理重构世界空间坐标

使用深度纹理获取 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT [关闭]

unity 从深度纹理重建世界坐标

unity shader 基础之十一 动画屏幕后处理深度纹理

unity如何从纹理图片中获取透明度参数

Unity Shader入门精要学习笔记 - 第13章 使用深度和法线纹理