我有一个OpenGL纹理渲染到第一个FBO,我需要编辑它的亮度,渲染到第二个FBO,然后在屏幕上绘制。
如果我将纹理渲染到第二个FBO(不修改其亮度)然后在屏幕上绘制它,它会正确显示。
如果我尝试编辑渲染纹理的亮度(使用纹理合成器函数,如glTexEnv
),我会得到错误的输出,如全黑或全白纹理,对比度改变,ecc ..
如果我在屏幕而不是FBO上绘制时应用亮度调节,则效果很好。亮度会按预期进行修改。
所以我的问题是:当我渲染到FBO时,我可以使用像glTexEnv
这样的纹理合并器函数吗?
这是我用来在绘制到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);
答案 0 :(得分:2)
为什么你不使用着色器? 我认为编写代码会容易得多
您正在使用FBO,这意味着Shaders - 您的硬件至少支持GLSL 1.2