Почему я не могу правильно визуализировать объекты с помощью FBO? - PullRequest
3 голосов
/ 25 марта 2010

Я пытаюсь реализовать простую программу, использующую 3 FBO для рендеринга сцены в текстуру и отображения текстурированного четырехугольника. Я успешно делал это ранее, используя фрагментные шейдеры, прежде чем проецировать на текстурированный квад, но не могу заставить его работать без шейдера. Что может быть не так?
Сначала я настроил свои текстуры

glGenTextures(3, renderTextureID);

for (GLint i = 0; i < 3; i++)
{
    glBindTexture(GL_TEXTURE_2D, renderTextureID[i]);
    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_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    // this may change with window size changes
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, fboWidth, fboHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
}

Следующее некоторое состояние кадрового буфера

glGenFramebuffersEXT(3, framebufferID);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[0], 0);
GLenum fboStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if(fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT)
{
    fprintf(stderr, "FBO Error!");
}
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[1]);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[1], 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[2]);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[2], 0);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

Тогда я отрисовываю сцену

glViewport(0, 0, fboWidth, fboHeight);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawModels();

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    ADDED: glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, renderTextureID[0]);

glEnable(GL_SCISSOR_TEST);
glViewport(windowWidth/2, 0, fboWidth, fboHeight);
glScissor(windowWidth/2, 0, fboWidth, fboHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBegin(GL_QUADS);
    glTexCoord2i(0, 0);
    glVertex2f(-1.0f, -1.0f);
    glTexCoord2i(1, 0);
    glVertex2f(1.0f, -1.0f);
    glTexCoord2i(1, 1);
    glVertex2f(1.0f, 1.0f);
    glTexCoord2i(0, 1);
    glVertex2f(-1.0f, 1.0f);
glEnd();

glDisable(GL_SCISSOR_TEST);
    ADDED: glDisable(GL_TEXTURE_2D);
glutSwapBuffers();

Результат - желтый квадрат. Draw модели рисует желтые каркасные кубы, если не использует FBO, так что проблема не в этом. Я читал предыдущий аналогичный пост, в котором говорится об использовании glTexParameterf после генерации и связывания текстур, но я сделал это.
Спасибо ...

1 Ответ

2 голосов
/ 25 марта 2010

Я не вижу четких данных в конечном буфере. Если это действительно так, и у вас включено Z-тестирование, то все рисование в конечном буфере рендеринга (при условии, что вы используете тот же Z-буфер) будет отклонено Z.

Хотя это дикое предположение, потому что все еще много кода, которого не хватает. Я полагаю, у вас нет ошибки GL?

Изменить, чтобы добавить: Вы включили текстурирование в фиксированной функции? glEnable(GL_TEXTURE_2D);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...