OpenGL:渲染到 FBO 时是不是支持纹理组合器功能?
Posted
技术标签:
【中文标题】OpenGL:渲染到 FBO 时是不是支持纹理组合器功能?【英文标题】:OpenGL: are texture combiner functions supported when rendering to FBO?OpenGL:渲染到 FBO 时是否支持纹理组合器功能? 【发布时间】:2012-02-09 15:47:56 【问题描述】:我有一个渲染到第一个 FBO 的 OpenGL 纹理,我需要编辑它的亮度,渲染到第二个 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);
【问题讨论】:
【参考方案1】:为什么不使用着色器? 我认为编写代码会容易得多
您正在使用 FBO,这意味着着色器 - 您的硬件至少支持 GLSL 1.2
【讨论】:
我没有使用着色器只是因为我什至不知道它们的存在 :-) 我编程只是作为一种爱好,这是我第一次使用 OpenGL..I'我是自学成才的。无论如何,几个小时前我发现了着色器的存在,我现在正在阅读“OpenGL Shading Language”一书。我试图弄清楚,之后我将尝试实现一个使用着色器的解决方案。我似乎只有一件事在这里......使用着色器是否可以从 FBO 读取纹理,修改它并渲染回 FBO?我只找到直接呈现到后台缓冲区的示例。 然后使用着色器......组合器很旧,并且功能比着色器少......使用着色器(实际上是片段着色器),您可以写入帧缓冲区(后台缓冲区)或自定义帧缓冲区对象。您不能在同一着色器中读取和写入同一纹理(缓冲区)。这是一个想法:设置您要写入(绘制)的 FBO,然后设置纹理和着色器...在屏幕上绘制全屏四边形...然后您的帧缓冲区(和纹理)中就有结果以上是关于OpenGL:渲染到 FBO 时是不是支持纹理组合器功能?的主要内容,如果未能解决你的问题,请参考以下文章