2017-10-30 4 views
2

私は最初gbufferに(位置、ノーマル、)のシーンをレンダリングが、延期にテクスチャがすべての時間をジッタた色を渡すレンダリングするので、私は色を変更したい次のようにGL_TEXTURE_2D_MULTISAMPLEにテクスチャを適用しましたが、失敗しました。なぜですか?openglのgbuffer使用GL_TEXTURE_2D_MULTISAMPLEテクスチャの問題

enum _GL_GBUFFER_TEXTURE_TYPE_ { _position_, _normal_, _albedo_spec_,_texture_cnt_ }; 
bool initialize(int2 dim){ 
     dim2 = dim; 

     //gbuffer 
     glGenFramebuffers(1, &gBuffer); 
     glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); 

     //position texture 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + _position_, GL_TEXTURE_2D, 
              textures[_position_].create2d(dim2, GL_RGBA32F/*GL_RGB16F*/, GL_RGBA/*GL_RGB*/, GL_FLOAT, NULL), 0); 
     //normal texture 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + _normal_, GL_TEXTURE_2D, 
               textures[_normal_].create2d(dim2, GL_RGBA32F/*GL_RGB16F*/, GL_RGBA/*GL_RGB*/, GL_FLOAT, NULL), 0); 
     //color texture 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + _albedo_spec_, GL_TEXTURE_2D_MULTISAMPLE, 
               textures[_albedo_spec_].create2d_msaa(dim2,GL_RGBA8,8), 0); 
               //textures[_albedo_spec_].create2d(dim2,GL_RGBA,GL_RGBA,GL_UNSIGNED_BYTE,NULL),0); 

     //tell OpenGL which color attachments we'll use (of this framebuffer) for rendering 
     GLuint attachments[_texture_cnt_]; 
     for (int i = 0; i < _texture_cnt_; i++) attachments[i] = GL_COLOR_ATTACHMENT0 + i; 
     glDrawBuffers(_texture_cnt_, attachments); 

     //create and attach depth buffer (renderbuffer) 
     glGenRenderbuffers(1, &rboDepth); 
     glBindRenderbuffer(GL_RENDERBUFFER, rboDepth); 
     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, dim2.x, dim2.y); 
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth); 

     //finally check if framebuffer is complete 
     if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){ 
      std::cout << "[GBuffer] : Framebuffer not complete!" << std::endl; 
      return false; 
     } 
     glBindFramebuffer(GL_FRAMEBUFFER, 0); 
     glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     return true; 
    } 
+0

答えで指摘されているGLの無効な使用を除いて、より根本的な問題があります。遅延シェーディングとマルチサンプリングがうまくいっていません。シェーディングパスの前にマルチサンプル解決を行うと、オブジェクトの最終的な色ではなく、異なるオブジェクトの属性が混在することになります。未解決のサンプルごとのデータを直接操作すると、基本的にマルチサンプリングがスーパーサンプリングに変わり、マルチサンプリングの利点がすべて無効になります。 – derhass

+0

ああ、私は参照してください!カメラが動いているときにテクスチャカラーのジッタ/パルスが発生するという問題を解決するにはどうすればよいですか? – redips

答えて

2

Khronos reference page - glCheckFramebufferStatusを参照)ので、あなたのフレームバッファが、完全ではありません。GL_RENDERBUFFER_SAMPLESの値が接続されているすべてのレンダで同じではない場合

GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLEが返されます。 GL_TEXTURE_SAMPLESの値が、接続されているすべてのテクスチャで同じでない場合。または添付されたイメージがレンダーバッファとテクスチャを混在させている場合、GL_RENDERBUFFER_SAMPLESの値はGL_TEXTURE_SAMPLESの値と一致しません。

これは、フレームバッファにアタッチするすべてのテクスチャがマルチサンプルテクスチャであることを意味します。

+0

助けてくれてありがとう!しかし、すべてのテクスチャをマルチサンプルテクスチャに変更した後、カメラが動いているときにテクスチャジッタのアーティファクトが残っていますが、どうすればこの問題を解決できますか? – redips

+0

^0 ^、私は新しい問題を作成しようとしましたが、どういうわけか私の質問の記述が要件を満たしていないと言います。カメラを動かすときに右の壁のテクスチャのジッタ/パルスを見ることができるリンク(ここではhttps://pan.baidu.com/s/1nuQ6KL7)を貼り付けるだけです。手伝ってくれてありがとう! – redips

関連する問題