Я пытаюсь реализовать алгоритм выбора лучей для рисования и выбора блоков (поэтому мне нужна изрядная точность). Изначально я выбрал реализацию лучей, но не чувствовал, что она достаточно точна (хотя ошибка могла быть связана с моим тестированием пересечения). Тем не менее, я решил попробовать выбрать с помощью буфера глубины и преобразовать координаты мыши в мировые координаты. Реализация ниже:
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 это даже для буферов глубины?
И, наконец, если этот метод не работает, лучше ли мне использовать идентификаторы цвета, чтобы точно определить, какой многоугольник был выбран?
deferredFBO->getDepth(...)
возвращает координату z клипа (в [-1,1]), а не значение глубины, как вы получили бы отglReadPixels
(в [0,1])? - person Mike Dinsdale   schedule 04.12.2013glGetTexImage
, но опять же вы, вероятно, заметили бы это - эффект будет больше, чем то, что вы, кажется, описываете (и, вероятно, будет хуже всего приближаться к возле самолета). Так что, возможно, он дает значение z клипа. - person Mike Dinsdale   schedule 04.12.2013