2012-01-04 14 views
3

テクスチャのレンダリングに時間がかかるのですが、少し問題があります。私は、すべてが機能していることを確認するために、画面に単純なクワッドをレンダリングしようとしています。テクスチャの問題にレンダリング

target->enable(); 

    glBegin(GL_QUADS); 

    glColor4f(1.f, 0.f, 0.f, 1.f); 
    glVertex3f(0.f, 0.f, 0.f); 

    glColor4f(0.f, 1.f, 0.f, 1.f); 
    glVertex3f(16.f, 0.f, 0.f); 

    glColor4f(0.f, 0.f, 1.f, 1.f); 
    glVertex3f(0.f, 16.f, 0.f); 

    glColor4f(1.f, 1.f, 0.f, 1.f); 
    glVertex3f(16.f, 16.f, 0.f); 

    glEnd(); 

    target->disable(); 

クワッドをスクリーンに通常描画すると、クワッドが期待どおりにレンダリングされます。しかし、レンダーターゲットを有効にしてクワッドを描画すると、クワッドは画面の左下隅にレンダリングされ、ターゲットにレンダリングされなくなります。

RenderTarget::RenderTarget(GraphicsDevice *graphics, GLuint width, GLuint height) { 

    mWidth = width; 
    mHeight = height; 

    // First create the depth buffer 
    glGenRenderbuffers(1, &mDepth); 
    glBindRenderbuffer(GL_RENDERBUFFER_EXT, mDepth); 

    // Tell OpenGL that this renderbuffer is going to be a depth buffer 
    glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, mWidth, mHeight); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); 

    glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0); 

    // Create the frame buffer texture 
    glGenTextures(1, &mTexture); 
    glBindTexture(GL_TEXTURE_2D, mTexture); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mWidth, mHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glBindTexture(GL_TEXTURE_2D, 0); 

    // Create the frame buffer 
    glGenFramebuffers(1, &mFbo); 
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); 

    // Attach the texture 
    glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexture, 0); 

    //Attach the depth buffer 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mFbo); 

    glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); 


} 

RenderTarget::~RenderTarget() { 
    glDeleteBuffers(1, &mFbo); 
    glDeleteBuffers(1, &mDepth); 
    glDeleteTextures(1, &mTexture); 
    mFbo = 0; 
    mDepth = 0; 
    mTexture = 0; 
} 

void RenderTarget::enable() { 
    // Bind the frame buffer 
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); 
    // store the glViewport and glEnable states 
    //glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); 

    glClearColor(1.f, 0.f, 0.f, 1.f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(0.f, 0.f, 0.f, 0.f); 

    glLoadIdentity(); 
} 

void RenderTarget::disable() { 
    // Restore glViewport and glEnable states 
    glPopAttrib(); 
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); 
} 
+0

FBO [完全](http://www.opengl.org/wiki/Framebuffer_Object#Framebuffer_Completeness)ですか?あなたは 'glCheckFramebufferStatus()'を呼び出すようではありません。 – genpfault

+0

さて、GL_FRAMEBUFFER_COMPLETE_EXTで戻ってきました。 – rcapote

答えて

3

。これは、スクエアがスクリーンの角に移動している理由を説明しています。

glPushAttribへのコールはコメントアウトしましたが、一致するコールはglPopAttribではありません。 glPushAttribを使用しない場合は、エラーフラグを設定してGL状態だけを残しておかなければなりませんが、そのような場合はわかりませんし、属性スタックが常に空であると想定するのは困ります。

targetはGL_DRAW_FRAMEBUFFER、GL_READ_FRAMEBUFFERまたは GL_FRAMEBUFFERのどちらかでなければなりません。glBindFrameBufferため

Thisドキュメントでは、最初の引数としてGL_FRAMEBUFFERまたはGL_DRAW_FRAMEBUFFERを使用されるべきであることを示唆しています。フレームバッファオブジェクトが GL_DRAW_FRAMEBUFFERまたはGL_READ_FRAMEBUFFERにバインドされている場合は、削除されるか 別のフレームバッファが対応するバインドポイントにバインドされるまで、それぞれ レンダリングまたはリードバック操作のターゲットになります。ターゲットがGL_FRAMEBUFFERに設定された glBindFramebufferを呼び出すと、framebuffer が読み込みフレームバッファターゲットと描画フレームバッファターゲットの両方にバインドされます。

コード内の_EXT接尾辞を持つ列挙型は、そこに記載されているバージョンより前のバージョンのOpenGLに関係している可能性があります。チュートリアルでは、このような詳細を古いものにすることができます。

環境を確認してください。&は、使用しているOpenGLのバージョンに一致するドキュメントを参照してください。なんらかの理由でOpenGLのバージョンを簡単に判断できない場合は、glBindFrameBufferを呼び出した後でGL_INVALID_ENUMエラーを確認してください。

2

このコードは間違っているようだ:

//Attach the depth buffer 
glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mFbo); 

あなたはここで何をしているあなたはmFboにレンダリングバッファとしてmFboを添付しようとしているということです。しかし、すでにレンダバッファが正しく接続されています(これはglFramebufferRenderbuffer()への最初の呼び出しで行われます)。私はそのコードを削除するとあなたの問題を解決すると思います。

1

私の疑問に、私の問題はglViewportを設定し、FBOをレンダリングするときにglOrthoを正しく設定していたことです。このコードはクリーンアップする必要がありますが、ここで私はそれを修正しました。あなたはglLoadIdentityと現在の行列(最も可能性の高いモデルビュー)をリセットされる可能

void RenderTarget::enable() { 
    // Bind the frame buffer 

    glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); 
    // store the glViewport and glEnable states 
    //glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); 

    glViewport(0, 0, mWidth, mHeight); 
    // projection matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    // orthographic projection 
    glOrtho(0, mWidth, 0, mHeight, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glClearColor(1.f, 0.f, 0.f, 1.f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(0.f, 0.f, 0.f, 0.f); 

    glLoadIdentity(); 
} 

void RenderTarget::disable() { 
    // Restore glViewport and glEnable states 
    //glPopAttrib(); 
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); 
    glViewport(0, 0, 1024, 768); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    // orthographic projection 
    glOrtho(0, 1024, 768, 0, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 
+0

上記のコードでは、マトリックスモードを手動で通常の設定に戻しています。スタックにプッシュ/ポップすることでこれを行う方法はありますか?私はglPushMatrix/glPopMatrixを試しましたが、それは期待通りに動作していないようです。 – rcapote

+2

'GLPushAttrib'を' GL_TRANSFORM_BIT'で実行すると、他の状態とともにマトリックスモードが保存されます。詳細については、ドキュメンテーションを確認してください。 – 01d55

関連する問題