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

Math 将屏幕空间顶点转换为像素空间点?(DirectX),math,directx,pixel,point,vertex,Math,Directx,Pixel,Point,Vertex,我的顶点已经乘以WVP矩阵,我需要知道它在屏幕上的确切位置 以下公式基本上是有效的,直到它说顶点出现在屏幕上,而它不应该出现在屏幕上: float x = vertex.x / vertex.w * screenwidth; float y = vertex.y / vertex.w * screenheight; 输入/输出示例: 输入 良好输出 x = -32941.28 y = -14419.7656 x = 10929.708; y = 4784.386; 输入 输出不良输出 x

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

以下公式基本上是有效的,直到它说顶点出现在屏幕上,而它不应该出现在屏幕上:

float x = vertex.x / vertex.w * screenwidth;
float y = vertex.y / vertex.w * screenheight;
输入/输出示例:
输入

良好输出

x = -32941.28
y = -14419.7656
x = 10929.708;
y = 4784.386;

输入

输出不良输出

x = -32941.28
y = -14419.7656
x = 10929.708;
y = 4784.386;
不良输出的x/y值应为负值。对于不同的输入值,一个简单的w=Abs(w)不起作用


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

我认为您要寻找的流行语是标准化设备坐标(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轴,但我没有任何来源(可能是其他人有想法)。

我在互联网上多次看到这个例子,它似乎是特定于OpenGL或其他类型的ViewProjectionMatrix,因为当我使用这个代码时,坐标显示在屏幕的右上角。它也不能解决正坐标和负坐标的问题。也许它与透视/视野有关?也许你需要解释更多,你想通过特定的代码行实现什么。我使用这个公式从投影坐标计算屏幕坐标有很多用途,它工作得很好。我正在使用DirectX和HLSL。我正在尝试在几何体着色器中生成线条,这些线条的宽度与它们的3d位置无关。我希望输出W值为1。一旦线位于近平面的后面,屏幕空间值就会变得不正确。我不能进行剔除,因为这样可以在线条仍然可见时将其删除。