问题一:
首先,不要禁用深度测试。进行深度测试before混合以确保正确丢弃片段,即使启用了混合也是如此。有关每个片段操作及其执行顺序的更多信息,请参阅第17.3节OpenGL 4.4 核心规范的一部分。
当你禁用深度测试时,你会得到意想不到的结果unless绘制调用的顺序是绝对正确的,因此违背了深度缓冲的目的。即使您的顺序正确,您也不能指望所有副作用都会消失,并且尝试按照您需要的方式对每个命令进行排序,除了最简单的程序之外,它对任何其他命令都不起作用。
考虑以下非常简单的示例:
你可以看到 3 个四边形,最远的可视化通常的 tex 坐标空间 (s,t E [0, 1]),一个与后者混合的蓝色四边形,以及一个不透明的红色四边形,它是应该在前面。显然,红色四边形isn't在前面,尽管深度值另有说明。同样明显的是,其目的是not将蓝色四边形与红色四边形混合。在蓝色四边形之后渲染红色四边形似乎可以解决问题,但如果您绘制另一个应该在后面的四边形both蓝色and红色四边形,它只会出现在禁用深度测试的顶部。这都是错误的。
黄色四边形掩盖了一切,尽管它应该位于红色和蓝色四边形后面。正确的图像如下,这是纯粹通过启用深度测试获得的:
我的一般建议是:除非您有充分的理由禁用深度测试,例如在渲染叠加层并且不想与深度缓冲区发生冲突时,否则请启用深度测试。
Note:深度缓冲并不能解决你通常必须安排的问题不透明的从后到前的几何图形以获得正确的结果!如果您想在尝试模拟透明度时完全独立于顺序,请在以下许多论文中寻找常见的嫌疑人顺序独立的透明度.
问题2:
从它的外观来看,我假设您使用以下混合函数:
gl::BlendFunc (gl::ONE, gl::ONE);
或任何能够导致稳定、连续的价值观积累的事物,例如
gl::BlendFunc (gl::SRC_ALPHA, gl::ONE);
以及 RGB 和 alpha 分量的默认混合方程:
gl::BlendEquation (gl::FUNC_ADD);
如果情况并非如此,请添加一条评论,说明实际值,以便我可以重新检查并可能编辑我的建议。以下内容仍然适用,因为颜色不会说谎。 ;)
你的第二个问题是由于投影下的深度冲突造成的。有些片段被正确丢弃,有些则不然。由于您显然有在某些地方完全重合的重复面,因此对于一个片段,可能会为第一个面生成稍高的深度值。当渲染第二个面时,会生成稍低的深度值,并且片段会通过,从而导致实际不应该出现的过度绘制。
第一个片段已经完成了所有的魔法,并且混合值被写入帧缓冲区,深度值被写入深度缓冲区,即,您有一个面部片段通过了所有测试并已与背景混合。现在是第二个片段not由于深度值略低而被丢弃,并再次与帧缓冲区中已混合的颜色混合。由于添加剂混合,您可以获得观察到的结果。我在以下示例中使用您使用的相同颜色和 alpha 值重现了这种情况:
问题3:你的模型似乎有很多重复的面孔,而且一般来说,三角测量看起来很糟糕。你真的应该重做一次。理解和使用混合本身就已经足够困难了。不要用次优数据使其复杂化。