Opengl 定制固定管道投影矩阵

Opengl 定制固定管道投影矩阵,opengl,Opengl,我正在研究使用固定管道变换的力。现在,对于视图和模型矩阵,我只需滚动自己的矩阵并通过以下方式加载它们: glMatrixPushEXT(GL_MODELVIEW); glMatrixLoadfEXT(GL_MODELVIEW, value_ptr(viewmodel) ); 我对透视矩阵视野有问题。创建persp矩阵的固定方法如下: glMatrixLoadIdentityEXT(GL_PROJECTION); glMatrixFrustumEXT(GL_PROJECTION, -aspect

我正在研究使用固定管道变换的力。现在,对于视图和模型矩阵,我只需滚动自己的矩阵并通过以下方式加载它们:

glMatrixPushEXT(GL_MODELVIEW);
glMatrixLoadfEXT(GL_MODELVIEW, value_ptr(viewmodel) );
我对透视矩阵视野有问题。创建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

更新:


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

使用glFrustum或GLMatrixTrustUmext确实允许指定FOV,而您实际上是这样做的。在定义近平面上的点和近平面的距离时,将隐含地定义fov(垂直和水平)

查看旧的透视函数:

gluPersepctive(fov_y, aspect, zNear, zFar)
这将生成具有给定垂直FOV_y的对称平截头体,如下所示:

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);

在您的代码中,您只需使用glFrustum或glMatrixFrustumEXT指定2*atan(1/nearF)的垂直视场即可

确实允许指定视场,而且您实际上是这样做的。在定义近平面上的点和近平面的距离时,将隐含地定义fov(垂直和水平)

查看旧的透视函数:

gluPersepctive(fov_y, aspect, zNear, zFar)
这将生成具有给定垂直FOV_y的对称平截头体,如下所示:

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)

?您已经成功地将
glMatrixLoadfEXT
用于modelview矩阵。是什么让你认为这对任何其他矩阵都不起作用,比如投影矩阵?为什么不试试看会发生什么(提示:它会做你和其他任何人都希望它做的事情)?顺便说一句,请尽量不要将你奇怪的间距约定带入书面自然语言。顺便说一句,如果你不使用直接状态访问,你也可以使用
glupperspective
,这可能正是你需要的。但是就像我说的,如果你有矩阵,就用它吧。我不确定,因为我不知道glMatrixFrustumEXT是如何工作的。我确实尝试过使用glMatrixLoadfEXT,但我在FOV方面有一些问题,这与我所追求的有所不同。“顺便说一句,请尽量不要把你奇怪的空格习惯带到书面自然语言中”——说什么?@MichaelIV:“说什么?”他说的是你倾向于把空格放在标点符号之前,而不是之后。在大多数情况下,空格是后面的。啊,好的,谢谢你的提醒。英语不是我的母语;)嗯?您已经成功地将
glMatrixLoadfEXT
用于modelview矩阵。是什么让你认为这对任何其他矩阵都不起作用,比如投影矩阵?为什么不试试看会发生什么(提示:它会做你和其他任何人都希望它做的事情)?顺便说一句,请尽量不要将你奇怪的间距约定带入书面自然语言。顺便说一句,如果你不使用直接状态访问,你也可以使用
glupperspective
,这可能正是你需要的。但是就像我说的,如果你有矩阵,就用它吧。我不确定,因为我不知道glMatrixFrustumEXT是如何工作的。我确实尝试过使用glMatrixLoadfEXT,但我在FOV方面有一些问题,这与我所追求的有所不同。“顺便说一句,请尽量不要把你奇怪的空格习惯带到书面自然语言中”——说什么?@MichaelIV:“说什么?”他说的是你倾向于把空格放在标点符号之前,而不是之后。在大多数情况下,空格是后面的。啊,好的,谢谢你的提醒。英语不是我的母语;)真正地那么“近平面”值定义了fov?很高兴知道。好吧,让我们清楚一点:近平面在代码中定义了fov。通常,人们会定义视场和到近平面的距离,并相应地计算剩余的平截头体参数。真的吗?那么“近平面”值定义了fov?很高兴知道。好吧,让我们清楚一点:近平面在代码中定义了fov。通常,可以定义FOV和到近平面的距离,并相应地计算其余的平截头体参数。