更改渲染顺序会破坏堆叠部分透明的字体纹理

Stacking partly transparent font textures is broken by changing render order

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

大部分情况下效果很好,文本显示在屏幕上,背景透明,让您可以按预期看到其背后的内容(图 1)

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

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

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

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

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

要解决此问题,您可以禁用深度测试或将三角形从后向前排序。