OpenGL - 正交投影矩阵,glViewport

Posted

技术标签:

【中文标题】OpenGL - 正交投影矩阵,glViewport【英文标题】:OpenGL - ortho Projection matrix, glViewport 【发布时间】:2011-04-06 21:41:21 【问题描述】:

我很难理解这些是如何工作的。首先,在 2d 游戏中,投影矩阵应该设置为左、右、上、下与窗口匹配的正交矩阵,对吗?但是当窗口调整大小时,我应该只改变 glViewport,而不是投影矩阵吗?以及如何保持纵横比?

有人能解释一下这两个东西在 2d 正交游戏中的用途,以便我更好地理解吗?

感觉 OpenGL 在 2d 设置中做了很多无用的事情。当图像已经存在时光栅化和计算片段,将顶点坐标转换为 NDC 仅通过 glViewport 转换回它们已经存在的位置。

另外,为什么在传统的免费 OpenGL 中我们必须制作自己的矩阵,而不是 glViewport 所做的我们自己的计算?

谢谢。

【问题讨论】:

【参考方案1】:

不要混淆输入到 GL 的内容和输出到的内容。

您用于计算正交矩阵的参数是与您的输入相关的参数。投影矩阵的输出始终是 [-1:1]x[-1:1]x[-1:1] 立方体。

视口将该立方体转换为您的渲染目标坐标。所以这通常是您想要更改的内容以匹配您的新窗口大小(嗯,那个和帧缓冲区本身)。

是的,GL 为 2D 渲染路径做了很多无用的事情。毕竟是 3D API...

最后我要说的是,您不必构建矩阵来进行 2D 变换,只要您的顶点着色器在我之前提到的立方体中输出即可。如果你想写视口的右上角,你总是可以直接将你的顶点传递为 (0,0) (0,1) (1,0) (1,1) 并简单地输出。

【讨论】:

谢谢,我想我现在明白了,我把输入和输出搞混了。由于我使用匹配窗口像素的顶点坐标,因此使用投影矩阵会使它变得容易得多。它所做的事情并不是真的没用,因为使用纹理对顶点进行光栅化意味着 OpenGL 可以为您缩放它们,并且您可以使用精确的顶点位置和旋转物体等,并且无论如何 OpenGL 仍然是最快的方法。我说的对吗?【参考方案2】:

不确定您使用的是哪种语言的 OpenGL,但如果您正在寻找 C++ 这个网站,http://nehe.gamedev.net/ 几乎涵盖了所有内容,并提供从简单的“Hello World”到基本游戏和 3d 的教程效果。

希望对你有帮助

【讨论】:

Nehe 教授使用已弃用的固定函数管道,我不想使用它(也从 c++ windows 的角度来看)。顺便说一句,我在 Mac 上使用 Objective C。我一直在寻找一个具体的答案。

以上是关于OpenGL - 正交投影矩阵,glViewport的主要内容,如果未能解决你的问题,请参考以下文章

openGL - 正交投影矩阵

OpenGL中的正交投影矩阵问题

OpenGL 3+,具有定向光的正交投影

OpenGL ES 学习 -- 正交投影

使用 GLM 正交投影矩阵将三角形顶点放在错误的位置

如何在缩放投影矩阵Opengl的同时平移光标位置