OpenGL Voxel游戏-避免透明度重叠

codeday· 2019-11-20
本文来自 codeday ,作者 codeday
我正在制作一个体素游戏,我将水设计为具有0.5 alpha的立方体.如果所有水都处于同一高度,则效果很好,如下图所示:

Water at the same height

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

Alpha overlapping at different heights

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

最佳答案
我找到了答案,却没有多次绘制场景.我希望它对某人有帮助:

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

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

enter image description here