5

多くのシャドウ マップを格納するために、opengl テクスチャ配列を使用しようとしています。残念ながら、フレームバッファをチェックすると、常に「添付ファイルが不完全です」というエラーが表示されます。nvidia のカスケード シャドウ マッピングの例のようにテクスチャ配列を設定しようとしました ( NVIDIA によるカスケード シャドウ マッピングの例を参照)。

だからここにいくつかのコードがあります:

  1. テクスチャの作成:

    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);
    
  2. FBO を作成します。

    glGenFramebuffers(1, &fbo_);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo_);
    glDrawBuffer(GL_NONE);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    
  3. シャドウ マップをレイヤーに描画します。

    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 ビット。古いドライバー バージョンは、新しいバージョンのシェーダー コンパイラーのバグによるものです。

4

0 に答える 0