Todo:
在HUD上渲染模型,
而不是渲染所有这些微小的多边形,
我们希望优化这些多边形并将其渲染为纹理,然后将该纹理用作一个多边形叠加层。
如果整个渲染的纹理具有空白像素或不透明像素,此方法就可以正常工作,
但是当我们的像素的alpha值在0到1之间时,就会出现问题。
例如说我们在模型中只有一个红色(1,0,0)多边形,其alpha值为0.5。
如果我们使用普通混合(SRC_ALPHA,1-SRC_ALPHA)将其渲染为纹理,则最终深红色(0.5,0,0)和alpha值为0.5 。
当将其用作纹理时,它比应有的颜色要深得多,基本上是因为红色多边形已与基本的“黑色”纹理。
无论显示什么背景,都是错误的。
我们需要的是纹理具有全红(1,0,0)颜色和0.5的alpha值,但是当我们彼此渲染多个alpha混合的多边形时,这将变得更加复杂。
有没有办法实现这一目标?
也许使用其他屏幕混合模式?
这需要在渲染到纹理的同时使用GPU来完成。
使用OpenGLES 2.0。
请提出建议。
谢谢
肖恩
答案 0 :(得分:0)
我们的艺术家找到了这个答案。虽然可能并不完全相同,但是非常好。
WE基本上使用了选项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
我们在叠加了多个透明胶片的情况下进行了测试,无法分辨出差异。颜色越不透明,原始的“零阿尔法黑色”就越少。除了实际使用创建的纹理的时间之外,不需要更改渲染管道。
肖恩