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的主要内容,如果未能解决你的问题,请参考以下文章