2011-10-27 38 views
2

FBOを使用してテクスチャにレンダリングしてからテクスチャを表示しようとしていますが、黒い矩形が表示されます。私のコードは次のとおりです。OpenGLテクスチャレンダリング(FBO)が機能しません

初期化:

glPushAttrib(GL_VIEWPORT_BIT); 
glViewport(0, 0, width_, height_); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo_); 
//draw stuff 
glPopAttrib(); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

使用テクスチャ(私はいくつかの静的なテクスチャを使用している場合ので、問題は、上記のコードでは、おそらくです:

#include <GL/glew.h> 
#include <GL/gl.h> 
#include <GL/glext.h> 
#include <assert.h> 

// ... 
GLuint fbo_, rbo_, tex_; 

glGenFramebuffers(1, &fbo_); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo_); 

glGenRenderbuffers(1, &rbo_); 
glBindRenderbuffer(GL_RENDERBUFFER, rbo_); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width_, height_); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo_); 

glGenTextures(1, &tex_); 
glBindTexture(GL_TEXTURE_2D, tex_); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width_, height_, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glGenerateMipmap(GL_TEXTURE_2D); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex_, 0); 

assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 

はFBOへのレンダリング、下のコードは動作します):

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex_); 

glBegin(GL_QUADS); 
glTexCoord2f(0, 0); 
glVertex3f(x_, y_, 0); 
glTexCoord2f(width_, 0); 
glVertex3f(x_ + width_, y_, 0); 
glTexCoord2f(width_, height_); 
glVertex3f(x_ + width_, y_ + height_, 0); 
glTexCoord2f(0, height_); 
glVertex3f(x_, y_ + height_, 0); 
glEnd(); 

問題を見つけるのを助けてください。

+0

最後のコードスニペットにもバグがあったと思います(0,0の代わりにx_、y_に相対するテクスチャ座標)。変更を反映するようにコードを更新します。 –

答えて

4

デフォルトのテクスチャ環境に依存する場合は、添付するテクスチャがcompleteであることを確認してください。

+0

チップをありがとう、私はミップマップ生成コードを追加しました。残念ながら、白い矩形の代わりに、私は黒い矩形を取得します。何か案は? –

+0

双線形フィルタリングを使用するので、ミップマップは必要ありません。とにかくまだ空の(または未定義の)テクスチャイメージ上の 'glGenerateMipmap'はゴミです。 'glGenerateMipmap'を削除してください(または、実際に試行線フィルタリングが必要な場合は、テクスチャにレンダリングした後に行います)が、他の' glTexParameteri'呼び出しはそのままにしてください。 –

+0

それを指摘してくれてありがとう! –

1

私は同じ問題を抱えており、テクスチャを作成するためにgenpfaultのアドバイスを使用しました。残念ながら、コメントを追加するには十分な評判がないので、ここでこの回答を追加しました。それでも、以下のコードは、あなたにいくつかの時間を節約することがあります。

// generate full viewport texture 
    glGenTextures(1, &fb_tex); 
    glBindTexture(GL_TEXTURE_2D, fb_tex); 
    // IMPORTANT: texture must be COMPLETE (mipmaps must be specified.. 
    // or the following parameters can be used if there are none) 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); 

    glTexImage2D(
     GL_TEXTURE_2D, 
     0, 
     GL_RGBA, 
     width, 
     height, 
     0, 
     GL_RGBA, 
     GL_UNSIGNED_BYTE, 
     NULL 
     ); 

私は私の元のコードに変更唯一のものは、2つのglTexParameteriとの2行を追加しました。パラメータは、必要なミップマップの量に応じて変更できます。

関連する問題