OpenGL 体素游戏 - 避免透明度重叠

OpenGL Voxel Game - Avoid transparency overlapping

我正在制作一个体素游戏,我将水设计为具有 0.5 alpha 的立方体。如果所有的水都在同一高度,效果很好,如下图所示:

但是,如果水的高度不同,就会发生 alpha 重叠:

如何防止这种重叠的发生? (例如,只为每个像素绘制最近的水体,丢弃其余的)。我是否需要使用 FrameBuffers,通过多次绘制场景,或者使用替代混合函数或采用另一种 GPU 成本较低的方法就足够了?

我在没有多次绘制场景的情况下找到了答案。我希望它对某人有所帮助:

我们将为每个像素绘制最近的水体,丢弃剩余的,从而避免重叠。

  1. 首先,你正常绘制实心方块。
  2. 然后,在颜色缓冲区中禁用写入后绘制水glColorMask(false,false,false,false)。 Z 缓冲区将根据需要进行更新,但尚未绘制任何水。
  3. 最后,您启用在颜色缓冲区中写入 (glColorMask(true,true,true,true) ) 并将 depthFunc 设置为 LEQUAL (glDepthFunc(GL_LEQUAL) )。只有最近的水像素才能通过深度测试(将其设置为 LEQUAL 而不是 EQUAL 会处理一些罕见但可能出现的浮点近似错误)。启用混合并再次绘制水将产生我们想要的效果: