Моя вершина уже умножена на матрицу WVP, мне нужно знать, где она отображается именно на моем экране.Преобразование вершины экрана в пиксель-пространство? (DirectX)
Следующая формула в основном работает, пока она не говорит вершина находится на экране, когда он не должен:
float x = vertex.x/vertex.w * screenwidth;
float y = vertex.y/vertex.w * screenheight;
Пример ввода/вывода:
вход
screenwidth = 684;
screemheight = 425;
vertex = {-8998.621, -6339.585, 111.8489, 186.8493};
хорошее выход
x = -32941.28
y = -14419.7656
вход
screenwidth = 684;
screenheight = 425;
vertex = {X:-8998,622 Y:-6339,585 Z:-638,1507 W:-563,1493};
плохо выход
x = 10929.708;
y = 4784.386;
В X/Y значения плохой выход должен быть отрицательным. Простой w = Abs (w) не делает трюк для разных входных значений ...
Итак: каков правильный способ преобразования вершины в пространстве экрана в точку в пиксельном пространстве?
Я видел этот пример много раз в Интернете, он кажется либо специфичным для OpenGL, либо каким-то другим видом ViewProjectionMatrix, потому что, когда я использую этот код, координаты отображаются в правом верхнем углу экрана. Это также не решает вопрос о координатах, которые являются положительными и должны быть отрицательными. Возможно, это что-то связано с перспективой/FOV? – ManIkWeet
Возможно, вам нужно объяснить больше, чего именно вы хотите достичь с помощью определенных строк кода. Я использую эту формулу для вычисления координат экрана из прогнозируемых координат для многих целей и работает нормально. Я работаю с DirectX и HLSL. – Gnietschow
Я пытаюсь сделать строки в геометрическом шейдере, линии, которые имеют одинаковую ширину, независимо от их трехмерной позиции. Я хочу, чтобы значение выходного W было равно 1. Когда линии идут за ближнюю плоскость, значения экранов становятся некорректными. Я не могу отбраковать, поскольку это удаляет строки, пока они все еще видны. – ManIkWeet