opengl - 如何在 OpenGL 中通过 2D 屏幕鼠标单击大型对象获得准确的 3D 深度?

标签 opengl 3d opengl-3 mouse-picking ray-picking

我正在根据 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
}

最佳答案

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

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

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

关于opengl - 如何在 OpenGL 中通过 2D 屏幕鼠标单击大型对象获得准确的 3D 深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30741975/

相关文章:

qt - 全新 Qt 安装不会运行 Qt 项目,包括许多 Qt 示例项目,如 “shader program not linked” 所示

javascript - WebGL : When using THREE. MeshFaceMaterial,每个面都有不同的方向

opengl - GLSL 顶点着色器中的眼睛空间像素宽度

c++ - OpenGL 中多个纹理的问题

linux - 无法将浮点值传递给 GLSL?

macos - 从 AVPlayerItemVideoOutput 到 openGL 纹理的最佳路径

c# - 我正在协助的一个项目是为客户使用 freeglut。我应该提出其他建议吗?

c# - WPF 3D - 应用转换,更改基础对象值

c++ - OpenGL 3.2 : Cache compiled shaders?

opengl - 渲染字体时使用texelFetch是不是更快?