我正在尝试实现射线拾取算法,用于绘制和选择块(因此,我需要相当数量的准确性)。最初,我使用了一个光线投射实现,但我觉得它不够准确(尽管故障可能与我的交叉测试有关)。无论如何,我决定尝试使用深度缓冲区来选择,并将鼠标坐标转换为世界坐标。执行情况如下:
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个单位(块宽为1个单位),只有在非常接近裁剪平面时才能得到足够的精度。
不准确的原因是使用单精度浮标,还是在我的计算中采取了一些步骤?如果我使用双精度值,并且OpenGL甚至支持深度缓冲区,这会有帮助吗?
最后,如果这个方法不起作用,我是否最好使用颜色if来准确地识别哪个多边形?
发布于 2013-12-03 20:32:46
颜色是要走的路,深度缓冲器的精度取决于平面距离,FBO纹理的分辨率,也取决于surface.The的法线或斜率,同样的精度问题发生在标准阴影过程中。(使用颜色比较容易,因为用深度相交测试一个物体有更多的“颜色”、深度值。如果一个物体有一种颜色,它会更准确。)
此外,也许只有我,但我喜欢避免相当复杂的矩阵计算,如果它们是不必要的。这就足够让可怜的CPU做其他的事情了。
对于双精度值,这可能会严重降低性能。我遇到过这样的性能下降,--我使用双倍比浮动慢了大约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位浮点数(double):fp64.txt和64bit.txt,但您不应该使用。
总之,我喜欢彩色聚乳酸,我喜欢颜色.
编辑:更多关于双精度深度:boards/showthread.php/173450-Double-Precision,这是一个很好的讨论
https://stackoverflow.com/questions/20360051
复制相似问题