2015-02-16 3 views
0

Моя вершина уже умножена на матрицу 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) не делает трюк для разных входных значений ...

Итак: каков правильный способ преобразования вершины в пространстве экрана в точку в пиксельном пространстве?

ответ

0

Я думаю, что лозунг, который вы ищете, - это нормализованные координаты устройства (NDC).

После преобразования вашей вершины с WVP и деления на w позиции находятся в NDC. Все видимые точки лежат между -1 и 1 по всей оси.

Чтобы разрешить координаты экрана с НДЦ, вы должны скорректировать формулу

float screen_x = (vertex.x/vertex.w + 1) * 0.5 * screenwidth; 
float screen_y = (vertex.y/vertex.w + 1) * 0.5 * screenheight; 

В моем случае я дополнительно должен был свести на нет оси у, чтобы достичь координат права, но у меня нет источника по какой-то причине (возможно, у кого-то есть идея).

+0

Я видел этот пример много раз в Интернете, он кажется либо специфичным для OpenGL, либо каким-то другим видом ViewProjectionMatrix, потому что, когда я использую этот код, координаты отображаются в правом верхнем углу экрана. Это также не решает вопрос о координатах, которые являются положительными и должны быть отрицательными. Возможно, это что-то связано с перспективой/FOV? – ManIkWeet

+0

Возможно, вам нужно объяснить больше, чего именно вы хотите достичь с помощью определенных строк кода. Я использую эту формулу для вычисления координат экрана из прогнозируемых координат для многих целей и работает нормально. Я работаю с DirectX и HLSL. – Gnietschow

+0

Я пытаюсь сделать строки в геометрическом шейдере, линии, которые имеют одинаковую ширину, независимо от их трехмерной позиции. Я хочу, чтобы значение выходного W было равно 1. Когда линии идут за ближнюю плоскость, значения экранов становятся некорректными. Я не могу отбраковать, поскольку это удаляет строки, пока они все еще видны. – ManIkWeet