Warm tip: This article is reproduced from serverfault.com, please click

android-为什么投影矩阵可以正确调整坐标?

(android - Why the projection matrix can adjust the coordinates correctly?)

发布于 2020-12-04 09:53:01

我从OpenGL ES Android开发指南中看到:“ ...投影矩阵重新计算了图形的坐标,以便它们正确映射到Android设备屏幕。”

的确,乘以项目矩阵后,一个简单的正方形可以正确显示在手机上,但是我很好奇魔术的工作原理。(我的直觉是模型矩阵应该做规模工作)

谁能用简单的语言解释它而又不涉及过多的计算机图形背景?

手机渲染问题

Questioner
Michael
Viewed
0
Kai Burjack 2020-12-04 19:12:52

如果你以OpenGL ES 1.0为目标,则有OpenGL固定功能管道。这里有GL_PROJECTIONGL_MODELVIEW矩阵堆栈(实际上还有一个用于纹理运算的堆栈,但这与这里无关)。

什么情况是,固定功能的管道只是会连接/乘这两个矩阵堆栈的顶部矩阵(我们指的是那些为PMV分别为投影矩阵和模型视图矩阵,)作为P * MV每个绘图调用和转换任何绘制顶点时v通过P * MV * v

当你以OpenGL ES 2.0或更高版本为目标时,不再有这种固定功能的矩阵堆栈,但是你将使用着色器并上载自己的矩阵(例如,作为制服或通过其他方式)。在那里,你可以完全自由地分解最终转换(以前P * MV是在固定功能管道中进行的)。最后,你要做的就是将顶点从其空间(通常称为“模型空间”)转换为“剪辑空间”坐标。剪贴空间是OpenGL ES 2.0(或更高版本)真正关心的唯一事情。

只是将最终矩阵(模型->剪辑空间)分解为投影,视图和模型矩阵是很方便的,因为它们在整个场景渲染期间会发生变化。投影矩阵通常仅包含保持不变的那些变换,并且仅在调整窗口大小(或重新配置垂直视场)时才需要刷新。也就是说,该矩阵从“视图空间”转换为“剪辑空间”,并表示摄像机的固有属性。

现在,在大多数情况下,还有一个专用的“视图”矩阵,它表示相机外部属性,通常是相机在世界上的位置和方向。因此,当你旋转/移动虚拟摄像机时,此矩阵会发生变化。并且此矩阵从“模型”空间转换为“视图”空间。

接下来,将有模型矩阵,代表世界上每个模型的转换。

最后,当你要渲染任何东西时,可以使用分解P * V * M(投影矩阵乘以视图矩阵乘以模型矩阵)在整个模型链->裁剪空间中转换顶点。

现在是关于为什么我们要在投影矩阵中进行缩放的问题:

原因是,一旦进入视图空间(在GL_MODELVIEW转换或自定义V * M转换之后),就会有一个空间,其轴与屏幕对齐。因此,你知道要缩放的内容(X轴或Y轴)以及缩放的比例。你不能简单地缩放模型,因为它也可能会任意旋转和平移。