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);
}
4

3 に答える 3

3

あなたの有効化は、現在のマトリックス(おそらくモデルビュー)をglLoadIdentity. これは、正方形が画面の隅に移動されている理由を説明しています。

glPushAttribへの呼び出しをコメントアウトしましたが、一致するへの呼び出しはコメントアウトしていませんglPopAttrib。他の場所で使用しない場合glPushAttrib、これはエラー フラグを設定し、GL 状態をそのままにしておく必要がありますが、それが事実であるかどうかはわかりません。属性スタックが常に空であると想定するのは面倒です。

このドキュメントはorを最初の引数としてglBindFrameBuffer使用する必要があることを示唆していますGL_FRAMEBUFFERGL_DRAW_FRAMEBUFFER

targetGL_DRAW_FRAMEBUFFER、GL_READ_FRAMEBUFFER、または GL_FRAMEBUFFER のいずれかでなければなりません。フレームバッファ オブジェクトが GL_DRAW_FRAMEBUFFER または GL_READ_FRAMEBUFFER にバインドされている場合、それが削除されるか別のフレームバッファが対応するバインド ポイントにバインドされるまで、それぞれレンダリングまたはリードバック操作のターゲットになります。glBindFramebufferターゲットを GL_FRAMEBUFFER に設定して呼び出す とframebuffer 、読み取りフレームバッファ ターゲットと描画フレームバッファ ターゲットの両方にバインドされます。

コード内の _EXT サフィックスを持つ列挙型は、そこに記載されているバージョンより前のバージョンの OpenGL に関連している可能性があります。チュートリアルでは、このような詳細が時代遅れになる傾向があります。

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

于 2012-01-04T22:20:38.223 に答える
2

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

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

ここで行っているのは、mFbo をレンダー バッファーとして mFbo にアタッチしようとしていることです。ただし、既にレンダー バッファーが正しくアタッチされています (これは glFramebufferRenderbuffer() への最初の呼び出しで行われます)。そのコードを削除すると問題が解決すると思います。

于 2012-01-04T22:00:30.617 に答える
1

私が疑ったように、私の問題は、FBO をレンダリングするときに glViewport と glOrtho を正しく設定することでした。このコードはクリーンアップする必要がありますが、これが私が修正した方法です。

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();
}
于 2012-01-04T22:04:03.590 に答える