Рендеринг OpenGL в текстуру (FBO) не работает

Я пытаюсь использовать 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();

Не могли бы вы помочь мне определить проблему?


person Dan Nestor    schedule 27.10.2011    source источник
comment
Я думаю, что у меня также была ошибка в моем последнем фрагменте кода (координаты текстуры относительно x_, y_ вместо 0,0). Я обновлю код, чтобы отразить мои изменения.   -  person Dan Nestor    schedule 27.10.2011


Ответы (2)


Убедитесь, что прикрепленная вами текстура завершена, если вы собираетесь полагаться на текстуру по умолчанию. Окружающая среда.

person genpfault    schedule 27.10.2011
comment
Спасибо за подсказку, я добавил код генерации mipmap. К сожалению, теперь вместо белого прямоугольника у меня получается черный. Любые идеи? - person Dan Nestor; 27.10.2011
comment
Вам не нужны MIP-карты, так как вы используете билинейную фильтрацию. И glGenerateMipmap на еще пустом (или неопределенном) изображении текстуры — это вообще ерунда. Удалите glGenerateMipmap (или, если вам действительно нужна триалинейная фильтрация, сделайте это после рендеринга в текстуру), но оставьте остальные вызовы glTexParameteri. - person Christian Rau; 27.10.2011

У меня была та же проблема, и я воспользовался советом 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
        );

Единственное, что я изменил в своем исходном коде, это добавить две строки с glTexParameteri. Параметры могут быть изменены в зависимости от количества MIP-карт, которые вы хотите/имеете.

person Avrdan    schedule 29.03.2014