gpt4 book ai didi

c++ - 使用深度缓冲区 : horribly inaccurate? 进行光线拾取

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:15 27 4
gpt4 key购买 nike

我正在尝试实现一种光线拾取算法,用于绘制和选择 block (因此我需要相当高的准确性)。最初我使用了光线转换实现,但我觉得它不够准确(尽管故障可能出在我的相交测试上)。不管怎样,我决定尝试使用深度缓冲区进行拾取,并将鼠标坐标转换为世界坐标。实现如下:

glm::vec3 Renderer::getMouseLocation(glm::vec2 coordinates) {
float depth = deferredFBO->getDepth(coordinates);

// Calculate the width and height of the deferredFBO
float viewPortWidth = deferredArea.z - deferredArea.x;
float viewPortHeight = deferredArea.w - deferredArea.y;

// Calculate homogenous coordinates for mouse x and y
float windowX = (2.0f * coordinates.x) / viewPortWidth - 1.0f;
float windowY = 1.0f - (2.0f * coordinates.y) / viewPortHeight;

// cameraToClip = projection matrix
glm::vec4 cameraCoordinates = glm::inverse(cameraToClipMatrix)
* glm::vec4(windowX, windowY, depth, 1.0f);

// Normalize
cameraCoordinates /= cameraCoordinates.w;

glm::vec4 worldCoordinates = glm::inverse(worldToCameraMatrix)
* cameraCoordinates;

return glm::vec3(worldCoordinates);
}

问题是这些值很容易为 ±3 个单位( block 为 1 个单位宽),只有在非常接近近裁剪平面时才足够准确。

不准确是因为使用了单精度 float ,还是我计算中的某个步骤?如果我使用 double 值会有帮助吗?OpenGL 甚至支持深度缓冲区吗?

最后,如果此方法不起作用,我是否最好使用颜色 ID 来准确识别选择了哪个多边形?

最佳答案

颜色是要走的路,深度缓冲精度取决于平面距离、FBO 纹理的分辨率,也取决于表面的法线或斜率。在标准阴影期间会发生同样的精度问题。 (使用颜色会更容易一些,因为通过深度相交测试,一个对象具有更多“颜色”和深度值。如果一个对象具有一种颜色,则更准确。)

此外,也许只有我一个人,但我喜欢在不必要的情况下避免相当复杂的矩阵计算。这足以让可怜的 CPU 做其他事情。

对于 double 值,这可能会严重降低性能。我遇到过这种性能下降,我使用 double 而不是 float 慢了大约 3 倍:

我的帖子: GLSL performance - function return value/type 和一个关于这个的文章: https://superuser.com/questions/386456/why-does-a-geforce-card-perform-4x-slower-in-double-precision-than-a-tesla-card

是的,您可以使用 64 位 float ( double ): http://www.opengl.org/registry/specs...hader_fp64.txt ,和 http://www.opengl.org/registry/specs...trib_64bit.txt ,但你不应该。

总而言之,使用彩色多边形,我喜欢颜色 khmm...

编辑:更多关于 double 深度:http://www.opengl.org/discussion_boards/showthread.php/173450-Double-Precision,这是一个很好的讨论

关于c++ - 使用深度缓冲区 : horribly inaccurate? 进行光线拾取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20360051/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com