2016-12-13 2 views
-1

シーンの奥行きをキューブマップテクスチャにレンダリングしようとしていますが、フレームバッファステータスをチェックすると、GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENTが返されますが、レンダリングは行われません。明らかに私は何かを見逃しているが、私はそれを理解しているようには見えない、私はここで誰かが私を助けてくれることを望んでいた。私のビデオカードは、OpenGL 4.5をサポートするNVIDIA GeForce 840Mです。以下は、fboにレンダリングを設定する方法です。キューブマップ深度テクスチャにレンダリングするためにOpenGL fboを設定すると、不完全な添付ファイルが表示されるのはなぜですか?

UPDATE:まずは簡単な間違いを処理してみましょう

GLuint texhandle; 
glGenTextures(1, &texhandle); 
glBindTexture(GL_TEXTURE_CUBE_MAP, texhandle); 
for (int i = 0; i < 6; i++) { 
    glTexImage2D(
     GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 
     GL_DEPTH_COMPONENT24, 1600, 900, 
     0, GL_DEPTH_COMPONENT, GL_FLOAT, 0 
    ); 
} 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 

GLuint fbohandle; 
glGenFramebuffers(num, &fbohandle); 
glBindFramebuffer(GL_FRAMEBUFFER, fbohandle); 
glCullFace(GL_BACK); 

for (int i = 0; i < 6; i++) { 
    glFramebufferTexture2D(
     GL_FRAMEBUFFER, 
     GL_DEPTH_ATTACHMENT, 
     GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,  
     fbohandle, 
     0 
    ); 
} 

for (int i = 0; i < 6; i++) { 
    GLenum cubemapSide = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, cubemapSide, fbohandle, 0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glDrawBuffer(GL_NONE); 
    CheckFramebufferStatus(); 
    RenderScene() 
} 
+0

ループ外で 'glFramebufferTexture2D'以外のすべてをやってはいけませんか?最初の面を貼り付けたばかりのとき、フレームバッファが不完全であることは驚くことではありません。 – BDL

+0

右は意味がありますが、glFramebufferTexture2Dを使ってレンダリングする面を指定していませんか?とにかく、ループを追加してレンダリングループの前に面を付けても、同じエラーが発生します。 – crimsoncheesecake

+0

glDrawBuffer(GL_NONE);意味がありません... – starmole

答えて

0

ループをレンダリングする前に、すべてのcubefacetexturesを取り付けます

glFramebufferTexture2D(..., fbohandle, ...); 

これは間違っている、あなたはもちろん、(特定のテクスチャオブジェクトを添付するtexhandleを使用する必要がありますその時点でfbohandleになります)。

しかし、レイヤードフレームバッファの仕組みについて誤解しているようです。 FBOあたりGL_DEPTH_ATTACHMENTしかないので、テクスチャオブジェクト(またはレンダリングバッファ)を1つだけ添付することができます。

あなたのコードが概念的に何をしているのか(上記の間違いを修正した後)は、キューブマップの各面を単一のレイヤーのない奥行きのある添付ファイルとしてバインドするので、ループの後に最後のキューブフェイスが付けられ、ループ自体完全に無意味です。

層状のレンダリングを使用するには、

キューブマップの場合には、キューブマップの両側に参照のうえ6層で深さの添付ファイルを作成し、より具体的にmimapレベルになります
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texobj, 0); 

に必要これらすべての0。

関連する問題