OpenGL 渲染到纹理透明度问题

发布于 2024-10-13 05:13:02 字数 348 浏览 7 评论 0原文

我构建了一个“后处理管道”,它收集渲染调用并将它们放入纹理中。渲染完所有后处理效果后,我将所有结果放在一起。这是我的问题:

一开始,我用 glClearColor(0,0,0,0) 清除缓冲区。然后我调用绘图调用。当对象的纹理透明度为 0.5 时就会出现这种情况。这会导致背景颜色和纹理之间的混合。我想避免混合。例如,如果纹理的像素为 0.5, 0.5, 0.5, 0.5,则结果为 0.25, 0.25, 0.25, 0.5,因为透明度为零的黑色背景受到影响。

我使用 glCopyTexImage2D 函数将渲染结果放入纹理中。我读过有关使用帧缓冲区的文章,但我想确定是否可以通过使用多个帧缓冲区来解决我的问题。

有人给我建议吗?

I build a "postprocessing pipeline" which collects rendercalls and puts them into a texture. After all postprocessing effects are rendered, I put all the results together. And here is my problem:

At the beginning, I clear the buffer with glClearColor(0,0,0,0). Then I call the draw calls. The comes when an object has a texture with 0.5 alpha. This results a mix between the backgroundcolor and the texture. I would like to avoid the mix. For example, if the pixel of the texture is 0.5, 0.5, 0.5, 0.5 the result is 0.25, 0.25, 0.25, 0.5, because the black background with zero transparency is affected.

I use the glCopyTexImage2D function the put my render result into a texture. I read articles about using a framebuffer, but I would like to be sure if I can solve my problem with using of multiple framebuffers.

Does anyone has an advice for me?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

木有鱼丸 2024-10-20 05:13:02

您可以在绘图时尝试使用预乘 alpha。基本上,确保所有颜色值已经乘以 Alpha 值。然后,

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

您将使用

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

纹理的像素为 0.25、0.25、0.25、0.5。结果将是 0.25, 0.25, 0.25, 0.5,因为这全部乘以 1。当然,您必须确保生成的输出纹理再次被正确解释为具有预乘的 Alpha。

维基百科的尘土飞扬的角落中有一个很好的解释。

You could try using premultiplied alpha when drawing. Basically, ensure that all your colour values are already multiplied by the alpha value. Then, instead of

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

you would use

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

The pixel of the texture would then be 0.25, 0.25, 0.25, 0.5. The result would be 0.25, 0.25, 0.25, 0.5 because this is all multiplied by 1. Of course, you must ensure that the resulting output texture is again interpreted correctly as having premultiplied alpha.

There's a pretty good explanation in a dusty corner of Wikipedia.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文