我正在尝试使用 opengl 纹理数组来存储大量阴影贴图。不幸的是,我在检查帧缓冲区时总是收到“附件不完整”错误。我尝试像在 nvidia 的级联阴影映射示例中那样设置我的纹理数组(请参阅 NVIDIA 的级联阴影映射示例)。
所以这里有一些代码:
创建纹理:
glGenTextures(1, &shadowMapArray_); glBindTexture(GL_TEXTURE_2D_ARRAY, shadowMapArray_); //maxArrayDepth_ = GL_MAX_ARRAY_TEXTURE_LAYERS glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT, size_, size_, maxArrayDepth_, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LESS); glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
创建 FBO:
glGenFramebuffers(1, &fbo_); glBindFramebuffer(GL_FRAMEBUFFER, fbo_); glDrawBuffer(GL_NONE); glBindFramebuffer(GL_FRAMEBUFFER, 0);
将阴影贴图绘制到图层中:
glUseProgram(programID_); glBindFramebuffer(GL_FRAMEBUFFER, fbo_); glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadowMapArray_, 0, currArraySize_); GLView::checkGLFramebuffer("ShadowMapGenerator::createShadowMap()"); //here i get the incomplete attachment [...] currArraySize_++;
系统规格:
带有 Nvidia 驱动程序 304.60 和 GTX 560 Ti 的 Debian Squeeze 64 位。旧驱动程序版本是由于较新版本中的着色器编译器错误。