复合纹理与alpha混合组件

问题描述 投票:1回答:1

所有:

  • 在我们的HUD上渲染模型, 但不是渲染所有这些微小的多边形, 我们想要优化并将这些多边形渲染到纹理,然后将此纹理用作单个多边形叠加。
  • 如果整个渲染纹理具有空白像素或不透明像素,则此方法可以正常工作 但是当我们有alpha值在0和1之间的像素时,我们就会遇到问题。
  • 例如。假设我们的模型中只有一个红色(1,0,0)多边形,alpha为0.5。 如果我们使用正常混合(SRC_ALPHA,1-SRC_ALPHA)将其渲染到纹理,我们最终会得到深红色(0.5,0,0)和0.5的alpha。 当它被用作纹理时,它比应该更暗,主要是因为红色多边形与纹理的基础“黑色”混合。 无论在什么背景下显示,都是错误的。

我们需要的是纹理具有全红(1,0,0)颜色和0.5的alpha,但是当我们将多个alpha混合多边形相互渲染时,这会变得更加复杂。

有没有办法实现这个目标? 也许使用不同的屏幕混合模式? 这需要在渲染到纹理的同时使用GPU完成。

使用OpenGLES 2.0。

请建议。 谢谢

肖恩

alphablending render-to-texture hud
1个回答
0
投票

我们的艺术家找到了答案。虽然它可能不完全相同,但它非常好。

Opengl Render To Texture With Partial Transparancy (Translucency) And Then Rendering That To The Screen

我们基本上使用选项2,将所有内容渲染为纹理,从黑色清晰纹理开始,但是当将此纹理渲染到hud时,修改像素着色器以简单地将颜色除以alpha。

这是有效的,因为在25%alpha处将颜色(1,0.5,0.2)添加到纹理中,然后纹理颜色将是(0.25,0.125,0.05)和0.25 alpha。向后划分0.25 alpha会使颜色返回(1,0.5,0.2),这正是我们所需要的。

因此,仅在使用创建的纹理时,将此行添加到像素着色器的末尾

outcol.rgb / = outcol.a

我们测试了多个透明胶片覆盖,无法区分。颜色越不透明,原始的“黑色零阿尔法”就越少。除了实际使用创建的纹理之外,它不需要对渲染管道进行任何更改。

肖恩

© www.soinside.com 2019 - 2024. All rights reserved.