将屏幕空间顶点转换为像素空间点? (的DirectX)

时间:2015-02-16 14:09:38

标签: math directx pixel point vertex

我的顶点已经与WVP矩阵相乘,我需要知道它在屏幕上的确切位置。

以下公式主要有效,直到它表示顶点在屏幕上时不应该:

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)不能用于不同的输入值......

那么:将屏幕空间中的顶点转换为像素空间中的点的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找的标语是规范化设备坐标(NDC)。

用WVP转换顶点并除以w后,位置在NDC中。所有可见点都位于所有轴的-1和1之间。

要从NDC解析屏幕坐标,您必须将公式调整为

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

在我自己的情况下,我还必须否定y轴以实现正确的坐标,但我没有原因(也许其他人有想法)。