Java OpenGL保存深度缓冲区

标签 java opengl jogl depth-buffer

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

归根结底,我有一个正在渲染的对象列表,我想确保该列表中的某些对象在其他对象之前渲染(尽管它们都位于相同的 Z 坐标)。有办法做到这一点吗?

谢谢, 杰夫

最佳答案

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

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

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

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

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

编辑:请注意,对于第二种技术,当您启用然后禁用深度缓冲区写入时,您仍然使用深度缓冲区测试,因此正常对象后面的透明对象(例如指向“屏幕”的 Helm )将不会'不会被吸引。

关于Java OpenGL保存深度缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2516086/

相关文章:

java:全局变量在线程中是否可见

java - 简单博客中的 JSf 请求范围

java - 基于 Rest 的 POST Web 服务的跨站点脚本支持

c++ - OpenGL 和 GLFW - 我需要着色器来绘制点吗?

c++ - Qt 和 openGL 的 gluPerspective 等价物

Java OpenGL 相机

java - 是否可以在准备语句或 QueryRunner.update() 中提供表名或列名的参数?

java - LWJGL - 文本颜色改变背景颜色

java - 如何确定JNI(jogl)在运行时是否可用?

java - 如何在JOGL中使用glDrawArrays显示立方体