投影矩阵导致剪辑截止问题

时间:2019-11-04 03:04:00

标签: c++ math glsl vulkan

我正在尝试设置渲染器,并且正在配置矩阵。我目前有一个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。

感谢您的帮助!

0 个答案:

没有答案