Java OpenGL-特定深度的像素颜色

Java OpenGL-特定深度的像素颜色,java,opengl,jogl,glreadpixels,Java,Opengl,Jogl,Glreadpixels,我已经在OpenGL中渲染了一个从gluOrtho透视图查看的3D场景。在我的应用程序中,我看到的是一个体积为100x70x60mm的立方体的正面(我有1000x700x600像素)。在这个立方体中,我呈现了一个简单的蓝色球,它正好位于中间,并填充立方体(半径300像素)。 现在我想读取立方体中特定点的像素颜色值(在3D中);i、 我想知道说点(100100,-200)是蓝色还是空白(黑色) glReadPixels只允许2D颜色提取,我已经用深度_组件尝试过了,但我不确定它应该以字节形式返回什

我已经在OpenGL中渲染了一个从gluOrtho透视图查看的3D场景。在我的应用程序中,我看到的是一个体积为100x70x60mm的立方体的正面(我有1000x700x600像素)。在这个立方体中,我呈现了一个简单的蓝色球,它正好位于中间,并填充立方体(半径300像素)。

现在我想读取立方体中特定点的像素颜色值(在3D中);i、 我想知道说点(100100,-200)是蓝色还是空白(黑色)

glReadPixels只允许2D颜色提取,我已经用深度_组件尝试过了,但我不确定它应该以字节形式返回什么?有没有办法把两者结合起来?我错过什么了吗


我将Eclipse与Java和JOGL一起使用。

这在OpenGL环境中是无法实现的——您需要某种场景图或其他空间分区方案与应用程序的数据结构协同工作


原因很简单:帧缓冲区仅在每个像素位置存储离眼睛最近的片段的颜色和深度(假设使用正常的GL_LESS depth函数)。存储在Z缓冲区中的深度值用于确定每个后续片段是否比现有片段离眼睛更近或更远,从而确定新片段是否应替换旧片段。帧缓冲区仅存储来自深度测试最新获胜者的颜色和深度值,而不是映射到该像素位置的整个片段集。事实上,如果是这样的话,就没有办法限制所需的图形内存量。

这在OpenGL环境中是无法做到的——您需要某种场景图或其他空间分区方案与应用程序的数据结构协同工作


原因很简单:帧缓冲区仅在每个像素位置存储离眼睛最近的片段的颜色和深度(假设使用正常的GL_LESS depth函数)。存储在Z缓冲区中的深度值用于确定每个后续片段是否比现有片段离眼睛更近或更远,从而确定新片段是否应替换旧片段。帧缓冲区仅存储来自深度测试最新获胜者的颜色和深度值,而不是映射到该像素位置的整个片段集。事实上,如果是这样的话,就没有办法限制所需的图形内存量。

你不是第一个陷入这种误解的人,所以我说这是最直截了当的方式:OpenGL不是这样工作的。OpenGL从不(!)处理对象或任何复杂场景。OpenGL只知道帧缓冲区、着色器和单个三角形。每当您绘制一个通常由三角形组成的对象时,OpenGL一次只能看到每个三角形。一旦有东西被拉到帧缓冲区,以前存在的东西就会丢失


有一些算法基于光栅化器(如OpenGL)的概念,可以将渲染场景分解为各个部分,深度剥离将是其中之一。

你不是第一个陷入这种误解的人,所以我说这是最直截了当的方法:OpenGL不是这样工作的。OpenGL从不(!)处理对象或任何复杂场景。OpenGL只知道帧缓冲区、着色器和单个三角形。每当您绘制一个通常由三角形组成的对象时,OpenGL一次只能看到每个三角形。一旦有东西被拉到帧缓冲区,以前存在的东西就会丢失


有些算法基于光栅化器(如OpenGL)的概念,可以将渲染场景分解为各个部分,深度剥离将是其中之一。

谢谢,这正是我所担心的。可以尝试Java3D,因为它使用场景图。还有更多的学习要做!只要有一个场景图就可以帮助你,因为场景图是一个纯粹的抽象表示,“颜色”只是一些数值。在这方面,Java3D甚至不如OpenGL有用。您需要做的是将场景剥离到其深度层中。基本上,您必须将光线投射到场景中,查看光线与哪些对象相交,并确定每个对象交点的曲面特性。在三角网格上,内部/外部确定更加困难,您必须为此进行一些空间细分。例如构建BSP树。很抱歉我的无知,但如何构建场景图?OpenGL在某种程度上支持这一点,还是我需要一种更为不同的方法?OpenGL只涵盖屏幕上的获取内容。场景图是用于管理要绘制的对象和控制渲染过程的数据结构。有一些现成的场景图库,还有一些其他3D引擎组件(OGRE、Irrlicht、Crystal Space)。但是我认为你想要做的是,你需要一些定制的东西。谢谢你的建议,我会浏览一下已经可用的库,但设想我必须创建自己的库。我不是真的对“查看”3D渲染感兴趣,只是从中提取数据并使用它。谢谢,这就是我担心的。可以尝试Java3D,因为它使用场景图。还有更多的学习要做!只要有一个场景图就可以帮助你,因为场景图是一个纯粹的抽象表示,“颜色”只是一些数值。在这方面,Java3D甚至不如OpenGL有用。您需要做的是将场景剥离到其深度层中。基本上,您必须将光线投射到场景中,查看光线与哪些对象相交,并确定每个对象交点的曲面特性。在三角网格上,内部/外部确定更加困难,您必须为此进行一些空间细分。例如构建BSP树。很抱歉我的无知,但如何构建场景图?开放吗