作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个体素游戏,我将水设计为具有 0.5 alpha 的立方体。如果所有的水都在同一高度,效果很好,如下图所示:
但是,如果水的高度不同,就会发生 alpha 重叠:
如何防止这种重叠发生? (例如,只为每个像素绘制最近的水体,丢弃其余的)。我是否需要使用 FrameBuffers,通过多次传递绘制场景,或者使用备用混合函数或采用另一种 GPU 成本较低的方法就足够了吗?
最佳答案
我在没有多次绘制场景的情况下找到了答案。我希望它对某人有所帮助:
我们将为每个像素绘制最近的水体,丢弃剩余的,从而避免重叠。
glColorMask(false,false,false,false)
中禁用写入后绘制水。 Z 缓冲区将根据需要更新,但还不会抽水。glColorMask(true,true,true,true)
) 并将 depthFunc 设置为 LEQUAL (glDepthFunc(GL_LEQUAL)
) .只有最近的水像素才能通过深度测试(将其设置为 LEQUAL 而不是 EQUAL 会处理一些罕见但可能出现的浮点近似错误)。启用混合并再次绘制水将产生我们想要的效果:关于OpenGL 体素游戏 - 避免透明度重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32642415/
我是一名优秀的程序员,十分优秀!