OpenGL学习系列(一)坐标系

342 阅读5分钟

OpenGL是什么?

Open Graphics Library,是一个功能强大、调用方便的底层图形库,它定义了跨编程语言、跨平台的专业图形程序接口,可用于二维或三维图像的处理与渲染。

它纯粹专注的渲染,其他内容都是承载平台实现,比如上下文和窗口的管理,所以它是跨平台的。

OpenGL ES?

三维图形应用程序接口 OpenGL的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,本质上是一个跨编程语音、跨平台的编程接口规范

OpenGL 1.x和2.x的区别

1.x:固定管线硬件, 2.x可编程管线硬件

固定管线硬件:1)、固定渲染管线 ——这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控制和纹理混合。T&L管线可以被渲染状态控制,矩阵,光照和采制参数。

可编程管线硬件:图形开发人员可以对渲染管线中的顶点运算和像素运算分别进行编程处理了,而无须象以前那样套用一些固定函数,取代设置参数来控制管线,最早出现与DX8,包括PS和VS两部分。

固定管线中原本由系统做的一部分工作,在可编程管线中必须需要自己写程序实现,具体程序为 vertex shader(顶点着色器)和 fragment shader(片元着色器)。

OpenGL坐标系(六种)

4727958-1f66d455a09110f9.png

1、OpenGL坐标系(物体、世界、照相机坐标系)属于右手坐标系,观察的方向是Z轴的负轴的方向?大家想想面对风吹来的方向是什么风就知道原因了。

大拇指朝右,食指朝上,中指方向是Z轴的正方向。

旋转方向:以负时针方向为正

2、设备坐标系使用的是左手坐标系

旋转方向:以负时针方向为正

1、物体或者模型坐标系(局部空间)

物体坐标系与特定的物体关联,每个物体都有自己特定的坐标系。不同物体之间的坐标系相互独立,可以相同,可以不同,没有任何联系。同时,物体坐标系与物体绑定,绑定的意思就是物体发生移动或者旋转,物体坐标系发生相同的平移或者旋转,物体坐标系和物体之间运动同步,相互绑定。

以物体某一点为原点而建立的“世界坐标”,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。

例如:每个人面向不同 的方向,这时要求所有人往前走,所有人都是以当前的坐标系为参考往前走,相互之间没有任何的影响。

以某一点为原点建立的“世界坐标”,自私的以“自我为中心”的坐标,坐标围绕着我来制定。

4727958-fe4bff69a8928bbb.png

2、世界坐标系

世界坐标系始终固定不变,以屏幕中心为原点(0,0,0)且始终不变,可以用世界坐标系去描述其他所有坐标系或者物体的位置。(本源坐标系),通过这个坐标系可以去描述和刻画所有想刻画的实体,观察的方向是Z轴负半轴的方向

3、观察者或者相机坐标系(视觉空间)

观察空间是将世界空间坐标转化为用户视野前方的坐标而产生的结果。因此观察空间就是从摄像机的视角所观察到的空间。而这通常是由一系列的位移和旋转的组合来完成,平移/旋转场景从而使得特定的对象被变换到摄像机的前方。这些组合在一起的变换通常存储在一个观察矩阵(View Matrix)里,它被用来将世界坐标变换到观察空间。

4、裁剪坐标系

观察值坐标通过投影来实现到裁剪坐标的转换,眼坐标通过乘以GL_PROJECTION矩阵变成了裁剪坐标。这个GL_PROJECTION矩阵定义了视景体( viewing volume),即确定哪些物体位于视野之内,位于视景体外的对象会被剪裁掉。除了视景体,投影变换还定义了顶点是如何投影到屏幕上的,是透视投影(perspective projection)还是正交投影(orthographic projection)。通过矩阵的变化实现。

17635612-a3fe8aebf7912742.png

左侧为透视投影(适用于3D投影),远小近大,右侧为正交投影(适用于2D)真实大小的反应

5、窗口或者屏幕坐标系

OpenGL然后对裁剪坐标执行透视除法从而将它们变换到标准化设备坐标。OpenGL会使用glViewPort内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标都关联了一个屏幕上的点。

Vclip=Mprojection⋅Mview⋅Mmodel⋅Vlocal 从右到左计算。

坐标系转换的过程就是OpenGL最终将图形渲染到的设备屏幕的流程,屏幕本质是2D空间,对图形进行渲染的过程就是将3D场景转换为最终的2D场景的过程。

对象显示过程

为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。下面的这张图展示了整个流程以及各个变换过程做了什么:

coordinate_systems.png