定制固定管道投影矩阵

时间:2013-05-02 08:53:36

标签: opengl

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

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?

1 个答案:

答案 0 :(得分: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