获得 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 深度纹理
Getting GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT with depth texturing
长期以来我一直在尝试实现阴影贴图,我正在使用 Lance Williams 的技术(将场景渲染两次,一次在光照下 space 一次在视图中 space).但是,当我在 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
编辑:我运行这个方法也在一个几乎空的项目中(抛出错误)
but I think I do have a texture attached to it.
不,你没有。
自
gl.glBindTexture(GL2.GL_TEXTURE, depthTexture);
只会生成 GL_INVALID_ENUM
错误,因为您在这里的意思是 GL_TEXTURE_2D
,您只有一个纹理对象的名称,并且从未为其创建纹理存储。您的 glTexImage2D
调用只会影响当时恰好绑定的其他一些纹理对象(甚至是旧版 GL 中的纹理对象 0)。
长期以来我一直在尝试实现阴影贴图,我正在使用 Lance Williams 的技术(将场景渲染两次,一次在光照下 space 一次在视图中 space).但是,当我在 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
编辑:我运行这个方法也在一个几乎空的项目中(抛出错误)
but I think I do have a texture attached to it.
不,你没有。
自
gl.glBindTexture(GL2.GL_TEXTURE, depthTexture);
只会生成 GL_INVALID_ENUM
错误,因为您在这里的意思是 GL_TEXTURE_2D
,您只有一个纹理对象的名称,并且从未为其创建纹理存储。您的 glTexImage2D
调用只会影响当时恰好绑定的其他一些纹理对象(甚至是旧版 GL 中的纹理对象 0)。