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 时是不是支持纹理组合器功能?的主要内容,如果未能解决你的问题,请参考以下文章

FBO:渲染到纹理,绘制渲染纹理时纹理映射错误

OpenGL:使用 FBO 和视口偏移问题渲染到纹理

OpenGL渲染到多个纹理,结果是白色的

Android OpenGL 1.1 FBO 和 VBO 支持

使用 FBO 和着色器 OpenGL 渲染到纹理

openGL FBO 复制到纹理导致黑色/深色图像