0

我正在使用强制使用固定管道转换的NV 路径扩展。现在,对于视图和模型矩阵,我只是自己滚动并通过以下方式加载它们:

glMatrixPushEXT(GL_MODELVIEW);
glMatrixLoadfEXT(GL_MODELVIEW, value_ptr(viewmodel) );

我对透视矩阵 FOV 有疑问。创建 persp 矩阵的固定方法是这样的:

glMatrixLoadIdentityEXT(GL_PROJECTION);
glMatrixFrustumEXT(GL_PROJECTION, -aspect_ratio, aspect_ratio, -1, 1, nearF, farF);

但它不允许传递自定义 FOV。所以它可能会根据上述方法的 l ,r ,b ,t 参数创建一些默认的 FOV。我可以用吗:

glMatrixLoadfEXT(GL_PROJECTION, myProjectionMatrix);

在不使用 glMatrixFrustumEXT 的情况下加载自定义投影矩阵?

更新:

正如一些人指出的那样,我可以像处理模型视图一样加载投影矩阵。但是我发现我的自定义投影看起来与使用 glMatrixFrustumEXT() 时的投影矩阵不同。可能FOV计算不同。有人知道 glMatrixFrustumEXT 是如何计算 FOV 的吗?

4

1 回答 1

3

使用 glFrustum 或 glMatrixFrustumEXT 确实允许指定 FOV,而您实际上是这样做的。当您定义近平面上的点和近平面的距离时,您隐含地定义了 fov,包括垂直和水平。

查看旧的 gluPerspective 函数:

gluPersepctive(fov_y, aspect, zNear, zFar)

这将生成一个具有给定 fov_y 垂直 FOV 的对称截锥体,如下所示:

top=tan(fov_y/2.0) * zNear; // assuming fov_y in radians here
bottom=-top;
left=bottom*aspect;
right=-left;
glFrustum(left, right, bottom, top, zNear, zFar);

在您的代码中,您只需指定 2*atan(1/nearF) 的垂直 FOV

于 2013-05-03T20:13:26.113 回答