我不完全确定我是否可以在这里做我想做的事,但我有一堆对象在OpenGL中渲染(使用JOGL)。对于一组对象,我想确保该组中的某些对象呈现在该组中的其他对象之前。我已经尝试清除深度缓冲区位并最后渲染“前”对象,这样可行,除非它在屏幕上混淆了其他深度缓冲。
它归结为我有一个正在渲染的对象列表,我想确保该列表中的某些对象呈现在其他对象的前面(尽管它们都在相同的Z坐标)。有没有办法做到这一点?
感谢, 杰夫
答案 0 :(得分:1)
这是绘制透明对象(具有alpha!= 1的部分的对象)的一种非常常见的技术。
最常见的方法是首先构建一个要绘制的对象树,然后在通过投影*相机矩阵后可以将其排序为“深度”。基本上不是盲目地在GPU上投掷三角形,而是在将世界处理它们作为临时缓冲区时逐个发送对象。这些对象完全了解每个三角形和每个顶点颜色/顶点着色器/纹理名称+ id等。然后,您可以对缓冲区进行排序(天真地,逐个对象,或基于跨对象的类似补丁的完整排序)。 / p>
glDepthMask技巧,如果我没记错的话,就是这样的:
glDepthMask(true);
drawOpaqueObjects();
glDepthMask(false);
drawTransparentObjects();
为了获得最佳效果,透明对象是从前到后排序的,但在大多数(简单)应用程序中,这并不重要。
编辑:请注意,对于第二种技术,当您启用然后禁用深度缓冲区WRITING时,您仍然使用深度缓冲区TESTING,因此正常对象后面的透明对象(例如,指向“进入”屏幕的头盔)赢了得到了。