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

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

感谢您的帮助!

zhuxiwangzhenliang 回答:投影矩阵导致剪辑截止问题

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3169306.html

大家都在问