0

我不完全确定我是否可以在这里做我想做的事,但我有一堆对象在 OpenGL 中渲染(使用 JOGL)。对于一组对象,我想确保该组中的某些对象呈现在该组中的其他对象之前。我已经尝试清除深度缓冲区位并最后渲染“前”对象,这很有效,除了它会弄乱屏幕上的其他深度缓冲。

归结为我有一个正在渲染的对象列表,我想确保该列表中的某些对象呈现在其他对象的前面(尽管它们都在同一个 Z 坐标处)。有没有办法做到这一点?

谢谢,杰夫

4

1 回答 1

1

这是绘制透明对象(具有 alpha!=1 的部分的对象)的一种非常常用的技术。

最常见的方法是首先构建一个要绘制的对象树,然后您可以在通过投影*相机矩阵后对“深度”进行排序。基本上不是盲目地向 GPU 扔三角形,而是在世界上处理对象时将它们一个一个发送到临时缓冲区。这些对象完全了解每个三角形和每个顶点颜色/顶点着色器/纹理名称+id 等。然后您可以对缓冲区进行排序(天真地,逐个对象,或基于对象之间的类似补丁的完整排序)。

如果我没记错的话,glDepthMask 技巧是这样的:

glDepthMask(true);
drawOpaqueObjects();
glDepthMask(false);
drawTransparentObjects();

为了获得最佳结果,透明对象从后到前排序,但在大多数(简单)应用程序中,这并不重要。

编辑:请注意,对于第二种技术,当您启用然后禁用深度缓冲区写入时,您仍然使用深度缓冲区测试,因此您的普通对象后面的透明对象(例如指向“进入”屏幕的头盔)不会被绘制.

于 2010-03-25T14:26:50.130 回答