我正在尝试设置渲染器,并且正在配置矩阵。我目前有一个View Matrix和一个Projection Matrix,然后将它们相乘并发送到着色器(因为我只是进行测试,因此不需要模型矩阵)。
问题是我似乎无法正确地获得投影矩阵。我的球体模型在屏幕中心切成两半,可以四处移动,但是一旦顶点的Z值似乎超过1(NDC的Vulkan最大值),模型就会被切掉。
这是视图矩阵的代码:
ViewMatrix(3, 0) = CamPos.X;
ViewMatrix(3, 1) = -CamPos.Y;
ViewMatrix(3, 2) = CamPos.Z;
左边的数字是行,右边的数字是列。矩阵是主要行。我的渲染器的坐标系是左手的。
这是投影矩阵的代码,该代码摘自The Vulkan Cookbook:
auto f = 1 / tan_half_fov;
_Matrix(0, 0) = f / _AspectRatio;
_Matrix(1, 1) = -f;
_Matrix(2, 2) = _Far / (_Near - _Far);
_Matrix(2, 3) = -1;
_Matrix(3, 2) = (_Near * _Far) / (_Near - _Far);
_Matrix(3, 3) = 0;
矩阵只是一个单位矩阵,它获得的每一帧都设置这些值。 tan_half_fov
是0.41421356,因为它是tan(45度/ 2)。 _Near
为1,而_Far
为500。
我也有GLM投影矩阵的代码,这是左手的0到1版本:
_Matrix(0, 0) = 1 / (_AspectRatio * tan_half_fov);
_Matrix(1, 1) = 1 / tan_half_fov;
_Matrix(2, 2) = _Far / (_Far - _Near);
_Matrix(3, 2) = 1;
_Matrix(2, 3) = -(_Far * _Near) / (_Far - _Near);
_Matrix(3, 3) = 0;
顶点着色器:
void main()
{
gl_Position = inData.Pos * vec4(inPos, 1.0);
}
inPos
是顶点位置的顶点数据输入,inData.Pos
是ViewProjection矩阵。
矩阵乘法代码工作正常,我对其进行了测试。仅将视图矩阵发送到着色器时,球体在屏幕上显示为全部平坦,并且可以正确移动。我正在使用Vulkan。
感谢您的帮助!