OpenGL:渲染到FBO时是否支持纹理合并器功能?

我有一个渲染到第一个FBO的OpenGL纹理,我需要编辑其亮度,渲染到第二个FBO,然后在屏幕上绘制它。

如果我将纹理渲染到第二个FBO(不修改其亮度),然后在屏幕上绘制它,它会正确显示。

如果我尝试编辑渲染纹理的亮度(使用像glTexEnv这样的纹理glTexEnv器函数), 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);

为什么你不使用着色器? 我认为编写代码会容易得多

您正在使用FBO,这意味着您的硬件支持Shaders - 至少GLSL 1.2

链接地址: http://www.djcxy.com/p/33919.html

上一篇: OpenGL: are texture combiner functions supported when rendering to FBO?

下一篇: FBO: render to texture, wrong texture mapping when drawing rendered texture