OpenGL - 正交投影矩阵,glViewport

标签 opengl 2d viewport projection-matrix

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

有人可以在二维拼字游戏中解释这两件事的目的,以便我更好地理解它吗?

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

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

谢谢。

最佳答案

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

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

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

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

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

关于OpenGL - 正交投影矩阵,glViewport,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619936/

相关文章:

c++ - 自从移动到 64 位后,我在随机 glVertexAttribArray 调用中从 nvoglv64.dll 获得了访问冲突

javascript - 如何更高效地进行这种坐标系操作呢?

javascript - 如何在 2d 游戏中对对象进行排序?

c - 对字符数组进行冒泡排序

javascript - 了解document.documentElement.clientWidth/Height返回的是哪个viewport,以及与window.innerHeight/innerWidth的区别

java - libgdx 如何获取世界单位的高度和宽度

c++ - opengl颜色四边形

opengl - 法线贴图,TBN矩阵计算

c++ - 在opengl中绘制几何图形

php - 根据浏览器视口(viewport),使用 javascript(无 jQuery)将 <div> 替换为 php 内容