OpenGL 体素游戏 - 避免透明度重叠
OpenGL Voxel Game - Avoid transparency overlapping
我正在制作一个体素游戏,我将水设计为具有 0.5 alpha 的立方体。如果所有的水都在同一高度,效果很好,如下图所示:
但是,如果水的高度不同,就会发生 alpha 重叠:
如何防止这种重叠的发生? (例如,只为每个像素绘制最近的水体,丢弃其余的)。我是否需要使用 FrameBuffers,通过多次绘制场景,或者使用替代混合函数或采用另一种 GPU 成本较低的方法就足够了?
我在没有多次绘制场景的情况下找到了答案。我希望它对某人有所帮助:
我们将为每个像素绘制最近的水体,丢弃剩余的,从而避免重叠。
- 首先,你正常绘制实心方块。
- 然后,在颜色缓冲区中禁用写入后绘制水
glColorMask(false,false,false,false)
。 Z 缓冲区将根据需要进行更新,但尚未绘制任何水。
- 最后,您启用在颜色缓冲区中写入 (
glColorMask(true,true,true,true)
) 并将 depthFunc 设置为 LEQUAL (glDepthFunc(GL_LEQUAL)
)。只有最近的水像素才能通过深度测试(将其设置为 LEQUAL 而不是 EQUAL 会处理一些罕见但可能出现的浮点近似错误)。启用混合并再次绘制水将产生我们想要的效果:
我正在制作一个体素游戏,我将水设计为具有 0.5 alpha 的立方体。如果所有的水都在同一高度,效果很好,如下图所示:
但是,如果水的高度不同,就会发生 alpha 重叠:
如何防止这种重叠的发生? (例如,只为每个像素绘制最近的水体,丢弃其余的)。我是否需要使用 FrameBuffers,通过多次绘制场景,或者使用替代混合函数或采用另一种 GPU 成本较低的方法就足够了?
我在没有多次绘制场景的情况下找到了答案。我希望它对某人有所帮助:
我们将为每个像素绘制最近的水体,丢弃剩余的,从而避免重叠。
- 首先,你正常绘制实心方块。
- 然后,在颜色缓冲区中禁用写入后绘制水
glColorMask(false,false,false,false)
。 Z 缓冲区将根据需要进行更新,但尚未绘制任何水。 - 最后,您启用在颜色缓冲区中写入 (
glColorMask(true,true,true,true)
) 并将 depthFunc 设置为 LEQUAL (glDepthFunc(GL_LEQUAL)
)。只有最近的水像素才能通过深度测试(将其设置为 LEQUAL 而不是 EQUAL 会处理一些罕见但可能出现的浮点近似错误)。启用混合并再次绘制水将产生我们想要的效果: