OpenGL - 正交投影矩阵,glViewport

6
我很难理解这些是如何工作的。首先,在2d游戏中,投影矩阵应该设置为正交,左、右、顶部、底部与窗口匹配,对吧?但是当窗口大小改变时,我只需更改glViewport而不是投影矩阵吗?如何保持纵横比?
有人能解释一下这两个东西在2d正交游戏中的用途,以便我能更好地理解它吗?
感觉OpenGL在2d设置中做了很多无用的事情。栅格化和计算片段时,图像已经存在,将顶点坐标转换为NDC,然后再通过glViewport转换回它们原来的样子。
此外,在无遗产OpenGL中,我们必须制作自己的矩阵,但不需要进行glViewport的自己的计算,为什么呢?
2个回答

5
不要混淆你输入到GL和它输出的内容。
计算正交矩阵所使用的参数是与你的输入相关的。投影矩阵的输出总是[-1:1]x[-1:1]x[-1:1]立方体。
视口将该立方体转换为渲染目标坐标。因此,通常您希望更改以匹配新窗口大小(以及帧缓冲本身)。
是的,GL在2D渲染路径中执行了很多无用的操作。毕竟它是一个3D API...
最后,我要说的是,你不必构建矩阵来进行2D变换,只要你的顶点着色器输出在我之前提到的立方体中。如果您想写入视口的右上角,您可以直接传递顶点为(0,0) (0,1) (1,0) (1,1),并简单地输出即可。

谢谢,我现在明白了,我把输入和输出搞混了。使用投影矩阵会使它变得更容易,因为我使用的顶点坐标匹配窗口像素。它所做的事情并不是真正无用的,因为使用纹理光栅化顶点意味着OpenGL可以为您缩放它们,并且您可以使用精确的顶点位置和旋转等内容。例如,而且OpenGL仍然是最快的方法。我是对的吗? - mk12

-4

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

希望对您有所帮助。


7
Nehe使用已弃用的固定函数管线进行教学,而我不想使用它(这也是从C++ Windows角度考虑)。顺便说一下,我在Mac上使用Objective C。我正在寻找一个具体的答案。 - mk12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接