2012-02-09 68 views
0

我有一个OpenGL纹理渲染到第一个FBO,我需要编辑其亮度,渲染到第二个FBO,然后在屏幕上绘制它。OpenGL:渲染到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); 

回答

2

为什么你不使用着色器? 我认为这将是更容易编写代码

您正在使用FBO,这意味着,着色器 - 至少GLSL 1.2是由你的硬件

+0

我没有使用着色器,只是因为我没有支持甚至知道它们存在:-)我只是作为一种爱好编程,这是我第一次使用OpenGL ..我是一个自学成才的人。无论如何,几个小时前我发现了着色器的存在,现在我正在阅读“OpenGL着色语言”一书。我试图找出它,然后我会尝试实现一个使用着色器的解决方案。只有一件事我似乎并没有在这里得到......使用着色器可以从FBO读取纹理,修改它并将其渲染回FBO?我只找到直接渲染到后台缓存的示例。 – Andrea3000 2012-02-10 10:05:32

+0

与着色器一起使用..然后..合并器是旧的,并且比着色器功能更少...使用着色器(实际上是片段着色器),您可以写入帧缓冲区(后缓冲区)或自定义帧缓冲区对象。您无法在同一着色器中读取和写入相同的纹理(缓冲区)。这里有一个想法:设置你想要写入(绘制)的FBO,然后设置纹理和着色器...在屏幕上绘制全屏幕四边形...然后在帧缓冲区(和纹理)中获得结果 – fen 2012-02-10 12:09:24

+0

非常感谢你!它很棒! – Andrea3000 2012-02-10 16:19:49