Я пытаюсь реализовать алгоритм выбора лучей, для рисования и выбора блоков (поэтому мне нужна большая точность). Первоначально я пошел с реализацией лучей, но я не чувствовал, что это было достаточно точно (хотя ошибка могла быть в моем тестировании пересечения). Несмотря на это, я решил попробовать выбрать с помощью буфера глубины и преобразовать координаты мыши в мировые координаты. Реализация ниже:
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 это для буферов глубины?
И наконец, если этот метод не работает, лучше ли мне использовать идентификаторы цвета, чтобы точно определить, какой полигон был выбран?
Цвет — это путь, точность буферов глубины зависит от расстояний между плоскостями, разрешения текстуры FBO, а также от нормали или наклона поверхности. Та же проблема точности возникает при стандартном затенении.(Использовать цвета немного проще, потому что с помощью теста пересечения глубины один объект имеет больше «цвета», значений глубины. Это более точно, если один объект имеет один цвет.)
Кроме того, возможно, это только я, но мне нравится избегать довольно сложных матричных вычислений, если они не нужны. Этого достаточно для плохого процессора, чтобы делать другие вещи.
Для значений двойной точности это может сильно снизить производительность. Я столкнулся с таким падением производительности, для меня это было примерно в 3 раза медленнее, чем использовать поплавки, а не поплавки:
мой пост:
GLSL performance — функция, возвращаемое значение / тип и
статья об этом:
https://superuser.com/questions/386456/why-does-a-geforce-card-perform-4x-slower-in-double-precision-than-a-tesla-card
да, вы можете использовать 64-битные числа с плавающей запятой (двойной):
http://www.opengl.org/registry/specs…hader_fp64.txt,
а также http://www.opengl.org/registry/specs…trib_64bit.txt,
но ты не должен.
В общем, используйте цветные краски, мне нравятся цвета, хмм …
РЕДАКТИРОВАТЬ: Подробнее о двойной точности глубины: http://www.opengl.org/discussion_boards/showthread.php/173450-Double-Precision, это довольно хорошая дискуссия
Других решений пока нет …