Java的OpenGL的节约深度缓冲(Java OpenGL saving depth buffer

2019-11-03 06:57发布

我不能完全肯定,如果我可以做什么,我想在这里,但我有对象了一堆在OpenGL(JOGL使用)被渲染。 对于一个组对象,我希望确保该组中的某些对象在该组中的其他对象的前面被渲染。 我试着清除深度缓冲位和最后呈现“前”的对象,而这样的作品,但它弄乱其他深度缓冲在屏幕上。

什么它归结为是我被渲染对象的列表,我想,以确保在该列表中的某些对象在其他对象的前面呈现(他们都在同一Z坐标虽然)。 有没有办法做到这一点?

谢谢,杰夫

Answer 1:

这是一个很常见的技术来绘制透明对象(即具有阿尔法份物体!= 1)。

最常见的做法是,先构建要绘制对象的树,然后可以沿着排序的“深度”,通过投影*摄像头矩阵传递后。 基本上,而不是在GPU只是一味地抛出三角形,您可以通过一个把你的对象一个为你在世界上处理他们到一个临时缓冲区。 这些对象都有每个三角形,每顶点颜色/顶点着色器/纹理名称+编号等的全部知识然后你就可以排序的缓冲区(无论是天真的,按对象,或完整的对象排序吹塑的基于类似的补丁跨越对象)。

该glDepthMask招,如果我记错,基本是这样的:

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

为了达到最佳效果的透明物体进行排序背到前面,但在大多数(简单)的应用程序,这并不重要。

编辑:注意,第二个技术,同时启用,然后禁用深度缓冲区写,你仍然可以使用深度缓冲测试,您的正常对象的后面那么透明物体(头盔指向“变成”屏幕为例)不会拿得出。



文章来源: Java OpenGL saving depth buffer