2

我正在通过 2D 屏幕鼠标单击计算 3D 坐标。然后我在计算的 3D 坐标处绘制点。代码没有错,方法没有错,一切正常。但是有一个问题与深度有关。

如果对象大小在 (1000, 1000, 1000) 左右,我会得到完整的深度,即对象面元的精确 3D 坐标。但是当我加载大小为(20000、20000、20000)的对象时,我没有得到准确的(深度)3D 坐标。我从表面得到一些偏移。该点与表面有一些偏移。所以我的第一个问题是为什么会这样?第二个问题是如何获得超大型物体的完整深度和准确的 3D 坐标?

我画了一个 3D 点

glDepthFunc(GL_LEQUAL);
glDepthRange(0.0, 0.999999);

并使用

glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &wz);
if(wz > 0.0000001f && wz < 0.999999f)
{
gluUnProject()....saving 3D coordinate
}
4

2 回答 2

2

发生这种情况的原因是深度缓冲区的精度有限。例如,一个 8 位深度缓冲区只能存储 2^8=256 个不同的深度值。

影响深度精度的第二个参数集是投影中近平面和远平面的设置,因为这是必须映射到深度缓冲区中可用数据值的范围。如果使用 8 位深度缓冲区将此范围设置为 [0, 100],则实际精度为 100/256 = ~0.39,这意味着眼睛空间中大约 0.39 个单位将分配相同的深度值。

现在解决您的问题:很可能您分配给深度缓冲区的位太少了。如上所述,这会引入错误,因为无法存储准确的深度值。这就是为什么这些点靠近表面,但不完全在表面上。

于 2015-06-09T22:13:25.417 回答
0

我已经解决了由于深度范围而发生的这个问题。因为 OpenGL 是一个状态机,所以我想我可能会在某个地方改变深度范围,应该从 0.0 到 1.0。我认为在清除深度缓冲区后放置深度范围总是更好,我曾经在清除深度和颜色缓冲区后进行以下设置。

解决方案:

{
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0, 1.0);
    glDepthMask(GL_TRUE);
}
于 2015-06-09T22:22:22.460 回答