多くのシャドウ マップを格納するために、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 ビット。古いドライバー バージョンは、新しいバージョンのシェーダー コンパイラーのバグによるものです。