【问题标题】:Rendering transparent texture onto glTexture将透明纹理渲染到 glTexture
【发布时间】:2017-08-16 03:03:05
【问题描述】:

我已经在 opengl 中工作了一段时间,相对顺利,但最近我注意到,当我在我的 fbo 纹理(自定义帧缓冲区)上渲染一个具有透明纹理的图元时,它会使 fbo 纹理在像素处透明图元的纹理是透明的。问题是在透明图元之前已经渲染了这个图元(纯色)背后的东西。所以 fbo 纹理在这些像素上不应该是透明的 - 混合纯色和透明色应该会产生纯色,不是吗?

所以基本上,opengl 正在为我的 fbo 纹理添加透明度,只是因为最后绘制的图元具有透明像素,即使它后面有纯色已经绘制到 fbo 纹理中。如果在渲染透明图元之前 fbo 纹理已经填充了纯色,opengl 不应该将透明纹理与 fbo 的现有像素混合,并导致纯色吗?

当我将我的 fbo 纹理渲染到默认帧缓冲区时会发生什么,清晰的颜色会从它的某些部分渗出 - 最后绘制的纹理是透明的。但是当我将同一个场景直接渲染到默认的 opengl 帧缓冲区时,场景看起来很好,并且清晰的颜色不会渗入透明纹理。

更有趣的是 glClearColor - 颜色仅在基元纹理的 alpha 具有渐变的情况下可见 - 透明颜色对纹理 alpha 为 1.0 或 0.0 的位置没有影响...这是一个错误吗?它似乎在 0.5 alpha 的像素处对图元纹理的影响最大。然后进一步高于或低于降低 glClearColor 的影响。

我知道这是一个有点复杂的问题/情况,老实说,我已尽力解释

我正在使用:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

将部分透明的图元绘制到 fbo 纹理中,然后将 fbo 纹理绘制到默认帧缓冲区中

这是绘制到默认 opengl fbo 中的 fbo-texture 的样子:

glClearColor 设置为红色。

【问题讨论】:

  • 在将 fbo 的纹理绘制到屏幕上之前,你记得重置混合吗?此外,任何代码或它发生的屏幕截图都会很好。
  • 您是否验证了 GL_BLEND 已启用?
  • 添加了屏幕截图 :) 我不想重置混合,因为我确实想要透明的 fbo 纹理,问题是 fbo 纹理在不应该透明的地方是透明的,混合使用默认帧缓冲区的清晰颜色
  • 你在哪里看到透明度,它不应该在哪里?这不就是过滤的结果吗? (当 fbo 的纹理应用于四边形时)
  • 似乎 clearColor 是(红色)正在影响四边形纹理具有渐变的 fbo 纹理,完全不透明的部分是正确的(图像左侧)并且完全透明的部分也是正确,与背景完全融合(右侧) - 但是中间的渐变受 clearcolor 影响

标签: opengl fbo alpha-transparency


【解决方案1】:

混合纯色和透明色应该会产生纯色,不是吗?

仅当您的混合模式告诉它时。它没有:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这会将相同的混合操作应用于颜色的所有四个分量。这导致最终的 alpha 是源 alpha 乘以自身并将其添加到目标 alpha 乘以 1-src alpha 的结果。

现在,您可以对颜色和 alpha 使用单独的混合函数:

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);

最后两个参数仅指定 alpha 的混合,而前两个参数指定 RGB 颜色的混合。所以这保留了阿尔法。 GL 3.x 及更高版本提供单独的混合功能,但也可作为旧硬件的扩展使用。

但在我看来,您可能根本不想更改 alpha。所以在渲染到纹理时只需mask alpha writes

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);

当您想再次写入时,不要忘记撤消 alpha 掩码。

【讨论】:

  • 嘿,很抱歉回来了,但是现在,当我在完成对第一个 fbo 纹理的渲染后将所有蒙版的组件重置为“true”,然后尝试渲染另一层(第二个 fbo纹理)在第一个 fbo-texture 后面,第一个 fbo-texture 的透明四边形纹理仅在该 fbo 中已经有纯色的情况下可见。但它适用于 1 fbo-texture!知道如何正确地在彼此之上渲染多个 fbo 纹理吗?提前谢谢你
  • 如果我不重置 glColorMask 那么底层根本不会绘制
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2012-03-10
  • 1970-01-01
相关资源
最近更新 更多