2012-05-03 96 views
0

私のプログラムでは、オフスクリーンレンダリングをする必要があります。そのために私はFBOを使用します。描画するイメージがテスト目的に適しているかどうかを確認するために、FBOからテクスチャにコピーしてテクスチャをクワッドにレンダリングします。問題は、FBOからテクスチャにコピーしてレンダリングすると、画像が暗く/黒色になりますが、形状は正しいことです。 FBOのアタッチメントとしてテクスチャを使用し、それを直接(別のテクスチャにコピーすることなく)レンダリングしようとしましたが、色は正しいです。 以下は、私がセットアップのための供給過剰を使用していレンダリング機能OpenGL FBOのテクスチャへのコピーは黒/暗い画像になります

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); //biding FBO 
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
//render code 
unsigned char *pixels= new unsigned char [600*512*4]; 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0); //unbiding 
glBindTextureEXT(GL_TEXTURE_2D,textureID[1]); //if I change to textureID[0] result is fine 
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,600,512,0,GL_RGBA,GL_UNSIGNED_BYTE,pixels); 
glBindTextureEXT(GL_TEXTURE_2D,0); 
glViewport(0, 0, 600, 512); 
glClearColor(1.0,1.0,1.0,1.0); 
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
glBindTextureEXT(GL_TEXTURE_2D, textureID[1]); 
    //setting the correct matrixes + render a quad 
//before rendering a quad I set the color with 
glColor3f(1.0, 1.0, 1.0); 
delete[] pixels; 
glutSwapBuffers(); 

//initial texture which works when rendered to a quad 
glGenTexturesEXT(3, &textureID[0]); 
glBindTextureEXT(GL_TEXTURE_2D, textureID[0]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 600, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
//second one which should be a copy of the above but has tha dark color mentioned 
glBindTextureEXT(GL_TEXTURE_2D, textureID[1]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 600, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTextureEXT(GL_TEXTURE_2D, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D,textureID[0],0); 
    //Attach depth buffer to FBO 
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb); 
st1=glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); 

今のテクスチャを作成するためのコードです。 FBOを元に戻してからglReadPixels(...)の代わりにテクスチャをバインドした後、glGetTexImage2Dなどの他の関数を試しましたが、成功しませんでした。

答えて

1

2番目のコードスニペットのglTexImage2Dの呼び出しを理解できません。 pixelsにはゴミだけが含まれます。あなたはそれが何をすると思いますか?


テクスチャは、非常に長い間、コアOpenGLでした。ただglGenTexturesglBindTexture...EXTではありません。また、FBO機能の...ARBバージョンを使用するか、(OpenGLのバージョンの)OpenGLコアフレームバッファサポートを使用することをお勧めします。

+0

私は大変申し訳ございませんが、奇妙な関数呼び出しを再チェックした後、愚かで幼稚な間違いを発見しました。私は、メモリからピクセルを作成し、作成したテクスチャにコピーしたいと思っていました。私が... EXTを使用した理由は、OpenGLのバージョンが2.0であるためにEXT_frame_buffer_objectを使用したためです(私がARBを読み込んだものが3.0から導入されたためです)。私は安全な側にするためにテキストを使用すると思った。このような愚かな質問をお送りいただき、申し訳ありません。この問題で私を手伝ってくれてありがとうございました。 – Ray

+0

ARBはOpenGL-3の前に導入されました。 OpenGL-3はそれらをコア機能にしました。また、EXTフレームバッファは、EXTテクスチャ関数が使用されることを意味しない。 glGenTexturesEXT、glBindTexturesEXTテクスチャ自体が拡張子だったとき(1994年)のOpenGL-1.0の日付。 – datenwolf

関連する問題