2

FBOを使用してテクスチャにレンダリングしてからテクスチャを表示しようとしていますが、取得できるのは黒い長方形だけです。私のコードは次のとおりです。

初期化:

#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にレンダリング:

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

テクスチャを使用します(静的テクスチャを使用するだけで、以下のコードが機能するため、問題はおそらく上記のコードにあります):

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();

問題を見つけるのを手伝ってもらえますか?

4

2 に答える 2

4

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

于 2011-10-27T17:53:42.257 に答える
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。パラメータは、必要な/持っているミップマップの量に応じて変更できます。

于 2014-03-29T23:03:53.950 に答える