我正在编写一些代码,这些代码必须将许多顶点坐标转换为CPU上的剪辑/投影空间(要与现有应用程序集成;在这里,着色器不是一个选项应用程序在以后提供自己的着色器),为此,我有一个测试案例,该测试案例打算使结果是基本的"摄像机式"转换 投影,从X轴旋转的相机。
测试案例如下:
#include <windows.h>
#include <xnamath.h>
#include <stdio.h>
int main()
{
XMVECTOR atPos = XMVectorSet(925.0f, -511.0f, 0.0f, 0.0f);
XMVECTOR eyePos = XMVectorSet(925.0f, -311.0f, 200.0f, 0.0f);
XMVECTOR upDir = XMVectorSet(0.f, 0.f, 1.f, 0.0f);
XMMATRIX viewMatrix = XMMatrixLookAtLH(eyePos, atPos, upDir);
XMMATRIX projectionMatrix = XMMatrixPerspectiveFovLH(XMConvertToRadians(55.f), 1.0f, 0.1f, 5000.0f);
XMMATRIX viewProjMatrix = viewMatrix * projectionMatrix;
XMVECTOR coord1 = XMVectorSet(925.0f, -500.0f, 0.0f, 0.0f);
XMVECTOR coord2 = XMVectorSet(925.0f, 0.0f, 0.0f, 0.0f);
XMVECTOR coord3 = XMVectorSet(925.0f, -1000.0f, 0.0f, 0.0f);
coord1 = XMVector3TransformCoord(coord1, viewProjMatrix);
coord2 = XMVector3TransformCoord(coord2, viewProjMatrix);
coord3 = XMVector3TransformCoord(coord3, viewProjMatrix);
printf(" 0: %g %g %gn", XMVectorGetX(coord2), XMVectorGetY(coord2), XMVectorGetZ(coord2));
printf(" -500: %g %g %gn", XMVectorGetX(coord1), XMVectorGetY(coord1), XMVectorGetZ(coord1));
printf("-1000: %g %g %gn", XMVectorGetX(coord3), XMVectorGetY(coord3), XMVectorGetZ(coord3));
getc(stdin);
}
如果我只是通过视图矩阵进行转换,我注意到y值正确地移动与坐标的输入y值相关。但是添加投影矩阵y值似乎围绕着将视图的"北"和视图的"南"坐标沿相同的投影空间延伸的坐标,这导致最终在目标应用程序中使用类似代码相互转换的面孔相互重叠,而不是按正确的顺序绘制。
我在这方面做错了什么,至少我该如何获得有效的结果(即,即使这些顶点不超出给定的投影范围,也以与输入y的前进相同的方式延伸,我怀疑这应该是一个问题)?
xmvector updir = xmvectorset(0.0f, 1.0f ,0.0F,0.0F,0.0F);