我一直在试图实施阴影贴图很长一段时间,我正在使用兰斯威廉斯的技术(渲染场景两次,一次在光线空间和一次在视图空间中)。但是,当我拨打glCheckFramebufferStatus
在GL_FRAMEBUFFER
,我得到GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
,后我已经拨打了glFramebufferTexture2D
就可以了。我很困惑,因为当没有纹理或渲染缓冲区附加到帧缓冲区时抛出错误,但我认为做了附加了纹理。获取具有深度纹理的GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
下面是运行在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'作为模式? –
它应该将输出矢量的所有四个分量设置为一个值。 – clabe45