OpenGL: поддерживаются ли функции объединения текстур при рендеринге в FBO? - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть текстура OpenGL, отрисованная для первого FBO, и мне нужно отредактировать ее яркость, отрендерить до второго FBO и затем нарисовать ее на экране.

Если я рендерим текстуру во второе FBO (безизменение его яркости), а затем нарисовать его на экране, он отображается правильно.

Если я пытаюсь отредактировать яркость визуализированной текстуры (используя функции объединения текстур, такие как glTexEnv), я получаю неправильный вывод, такой как вся черная или вся белая текстура, с измененным контрастом, ecc.Я применяю регулировку яркости во время рисования на экране вместо FBO, он отлично работает .. яркость изменяется, как и ожидалось.

Поэтому мой вопрос: могу ли я использовать функции объединения текстур, такие как glTexEnv, когда я рендерим в FBO?

Это код, который я использую для изменения яркости при рисовании в FBO (он не работает):

// "secondFBO" is the FBO I'm intended to render to after brightness regulation.
// "textureId" is the OpenGL texture attached to the first FBO that contains
// the unmodified texture.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, secondFBO);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textureId);

// apply alpha filter
double t = brightnessValue;     
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
if (t > 1.0f)
{
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_ADD);
    glColor4f(t-1, t-1, t-1, t-1);
}
else
{
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_SUBTRACT);
    glColor4f(1-t, 1-t, 1-t, 1-t);
}
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,         GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,         GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,    GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,       GL_TEXTURE);

// ... draw texture ...

glDisable(GL_TEXTURE_RECTANGLE_ARB);

// restore previous state
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

// draw on screen
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
// "textureId2" is the texture attached to the second FBO
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textureId2);

// ... draw texture ...

glDisable(GL_TEXTURE_RECTANGLE_ARB);

1 Ответ

2 голосов
/ 10 февраля 2012

Почему вы не используете шейдеры?Я думаю, что было бы намного проще написать код

Вы используете FBO, а это означает, что шейдеры - по крайней мере GLSL 1.2 поддерживаются вашим оборудованием

...