通过更改渲染顺序可以打破堆叠部分透明字体纹理

时间:2017-02-21 10:03:49

标签: opengl transparency hud

我是OpenGL的新手,并试图通过创建我自己的简单游戏引擎来重新发明轮子(为了好玩),现在我正在尝试用文本制作HUD。为此,我以编程方式为片段着色器生成字体纹理贴图以用于纹理四边形,据我所知,这是正常的方法吗?

这大部分工作都很好,屏幕上显示的文字带有透明背景,让您可以按预期看到背后的任何内容(图1)

如果我然后在与第一个相同的区域中添加另一个文本网格但具有更高的z-index(更接近相机),则它会在前一个文本的顶部渲染并在预期中混合(正确的用法?)方式(图2)

然而,如果我然后反转z-index - 使第一个字符串(粉红色的一个)更靠近相机(但渲染顺序不变),我看到图中的效果。 3 - 尽管文本背景仍然是透明的,但它似乎覆盖了其他文本而不是与之混合。

注意:如果我颠倒渲染两个网格的顺序,则会产生相同的效果,但白色文本将成为违规者。

换句话说,如果z-indices的顺序与渲染顺序匹配,为什么它只能正确混合?我的假设是,如果我尝试使用部分透明背景渲染“背后”的四边形,我必须首先渲染它,否则深度测试会将其顶部切掉。这是我应该习惯的图形渲染的基本规则吗?我是否只需要跟踪堆叠顺序并确保以正确的顺序渲染项目?

render order affects blending

1 个答案:

答案 0 :(得分:2)

虽然您可以查看纹理的透明部分,但OpenGL不能。当它混合颜色时,它仍然将深度缓冲区设置为某个值,当你想渲染它后面的东西时,它会被隐形部分阻挡。

要解决此问题,您可以禁用深度测试,也可以从后到前对三角形进行排序。