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

时间:2015-09-18 01:20:30

标签: opengl 3d alpha depth-buffer voxel

我正在进行体素游戏,我将水设计为0.5 alpha的立方体。如果所有的水都处于相同的高度,它的效果很好,如下图所示:

Water at the same height

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

Alpha overlapping at different heights

如何防止出现这种重叠? (例如,仅为每个像素绘制最近的水体,丢弃剩余的水体)。我是否需要使用FrameBuffers,使用多次传递绘制场景,或者使用备用混合函数或采用另一种较少GPU的方法就足够了?

1 个答案:

答案 0 :(得分:3)

我找到了一个没有通过多次传递绘制场景的答案。我希望它对某人有所帮助:

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

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