【问题标题】:Java OpenGL saving depth bufferJava OpenGL 保存深度缓冲区
【发布时间】:2010-03-25 13:56:05
【问题描述】:

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

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

谢谢, 杰夫

【问题讨论】:

  • “搞乱屏幕上的其他深度缓冲”是什么意思。请更清楚地说明这一点。
  • 还有其他对象似乎没有进行适当的深度缓冲。现在显示在其他对象下方(z 坐标更远)的线条。

标签: java opengl jogl depth-buffer


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 谢谢。不过,在这种情况下,我不会尝试使用 alpha 绘制组件。我在屏幕上有一堆彼此非常接近的对象,当用户单击一个时,我想将其冒泡到顶部。
  • 在这种情况下,我会使用真正的 Z 轴来订购它们。其他任何事情,尤其是多重解析渲染,都会无缘无故地减慢您的应用程序。
  • 问题在于这是一个地图应用程序,Z 轴会影响项目的高度(我不想这样做)。因此,如果我在同一高度有两个相互重叠的项目,我希望能够指定哪些项目“在顶部”呈现。
  • 好的,那怎么样?您通常首先绘制未选择的所有内容,然后针对深度缓冲区进行编写和测试。之后,您禁用深度缓冲区测试(和写入,但这不再重要)并绘制应该在顶部的对象。这仅适用于您在顶部绘制的对象是凸面的(最好是矩形)。
  • 如果我理解正确的话,我已经尝试过这样做。我认为我在挣扎的地方是我是否需要绘制场景中未选择的所有对象(背景中还有其他类型的对象无法选择)?或者只是在这一组对象中绘制未被选中的对象(即这组对象中有可以选择的对象)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多