0

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

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

glReadPixels 只允许对颜色进行 2D 提取,我已经使用 DEPTH_COMPONENT 进行了尝试,但不确定这应该以字节形式返回什么?有没有办法将两者结合起来?我错过了什么吗?

我正在使用带有 Java 和 JOGL 的 Eclipse。

4

2 回答 2

4

这不能在 OpenGL 的上下文中完成——您需要某种场景图或其他空间分区方案与您的应用程序的数据结构协同工作。

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

于 2011-01-27T01:02:13.627 回答
1

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

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

于 2011-01-27T10:21:08.203 回答