我正在尝试为OpenGL和Direct3D API使用单个矩阵堆栈。从我对本网站的所有研究和其他文章: Article 1, Article 2除其他外,我的理解是,只要处理某些细微差别并保持一致性,这应该相当容易。
此外,此MSDN Article表示HLSL默认使用column_major格式。
所以我有一个工作的右手坐标系统,Column_Major MVP矩阵用于opengl。
我试图在DirectX中使用相同的矩阵。由于它是一个右手系统,我确保我设置了rasterizerDesc.FrontCounterClockwise = true;
我的HLSL着色器中有以下内容:
output.position = mul(u_mvpMatrix, input.position);
请注意,在上面的代码中我使用了后乘法,因为我的mvp-matrix是专业列,我将它发送到着色器而不转置它。所以它应该将它作为列主要发送,因此,后乘。
注意:我确实尝试过预乘,以及使用mvp的转置进行后置和预乘。
在计算投影矩阵时,如上文第2条所述,我确保DX的深度范围是0-1,而openGl的深度范围是-1到1!
我甚至在DirectXMath库中针对XMMatrixPerspectiveFovRH
函数测试了我的结果矩阵,我的矩阵与该函数生成的矩阵匹配。
现在设置光栅化标志 - > FrontCounterClockwise = true
,RH列主要MVP矩阵,具有正确的深度缩放,我原本预计这将是让D3D与我的Matrix一起工作所需的全部内容。
我在这里失踪的是什么?
P.S:我相信我在这里提供了所有信息,但如果需要更多信息,请告诉我。