我正试图从世界空间转换为屏幕空间。但是,由于我使用的库处理矩阵的方式,我只能检索世界,视图和投影矩阵的顶点;我不能自己检查。这是一个示例矩阵:
(1.65879, -0.000909163, -1.4656, -1721.39)
(1.20199, -1.64605, 1.36146, 3048.55)
(0.450536, 0.75107, 0.510306, 9264.52)
(0.444465, 0.740951, 0.50343, 9339.69)
我曾经假设在屏幕空间中找到对象的位置将是一个简单的问题,即通过该值转换原点[(0,0,0)处的点)。然而,这显然是错误的:
D3DMATRIX matrix;
D3DXVECTOR4 position;
D3DXVECTOR4 input;
D3DVIEWPORT9 viewport;
GetVertexShaderConstantF(0, (float *)&matrix, 4);
GetViewport(&viewport);
input.x = 0.0f;
input.y = 0.0f;
input.z = 0.0f;
input.w = 1.0f;
D3DXVec4Transform(&position, &input, (D3DXMATRIX *)&matrix);
float x = ((position.x / position.w) * 0.5f + 0.5f) * viewport.Width + viewport.X;
float y = (1.0f - ((position.y / position.w) * 0.5f + 0.5f)) * viewport.Height + viewport.Y;
此方法仅返回450,375(+/-几位小数)的结果,视口大小为两倍;基本上,它给出了视口的死点。
我在上面的代码段中做错了什么?
(旁注,我只是试图调试一个我没有源代码的程序。因此,当着色器接收到它的输入时,这是我可以在屏幕上拦截模型位置的唯一点空间)。
答案 0 :(得分:1)
在
GetVertexShaderConstantF(0, (float *)&matrix, 4);
你必须致电
D3DXMatrixTranspose(&matrix, &matrix);
因为DirectX在代码中使用行主矩阵,而在着色器中使用列主要矩阵(或者反过来,我现在不记得)。