通俗的说OpenGL画图原理2

来源:互联网 发布:网页登录sql注入语句 编辑:程序博客网 时间:2024/06/03 09:26

通俗的说OpenGL画图原理2

 

       我的上一篇创新文档讲了OpenGL是如果根据2D屏幕坐标点来绘制图像的,以及从大方面来解释了为什么需要使用OpenGL,而不是仅仅使用Canvas之类的绘图方式。当然,正如我上次所说,所有观点只是我对OpenGL的一种理解,难免有一定的错误和不严谨,希望大家谅解。

这篇创新文档我们来看看,光栅化用到的2D屏幕的坐标点是如何得来的,以及OpenGL在光栅化之前又做了什么操作。

OpenGL在光栅化之前的工作主要是进行投影、图元剪裁和屏幕映射。我发现到这一步的时候我就已经不太好讲解了,尽力而为吧。首先,我们明确下什么是三角形。我们说“三角形”,那只是人类的表达方式,计算机并不认那三个汉字,因此,“三角形”对应到计算机中应该是三个坐标顶点,并且以“三角形”的样子对这三个顶点进行处理。三角形是OpenGL能够处理的其中一种图元,其它的图元如点、线段、四边形、多边形等,具体先不介绍。可以这么说,一个3D空间中的三角形(准确地说,是位于观察坐标系或者眼睛坐标系中的三个坐标顶点),经过投影、图元剪裁和屏幕映射,就得到了2D屏幕下的坐标点。

我们先讲投影是怎么回事,如下图所示,为一个透视投影的模型我们先不要过于关注图中的6个平面,你只需要知道,它们是可以通过OpenGLAPI函数来进行确定的,并对图像的效果会有一定的影响,但不影响绘制过程。图中

A点即为3D空间中的坐标顶点,通过它往视点连线,这根直线肯定会与近平面相交于一点,如图中的点B。这样就完成了投影操作。很简单吧?实际上,这个过程是由OpenGL通过矩阵运算完成的,该矩阵被称为齐次投影矩阵,由用户通过OpenGLAPI函数进行确定,具体矩阵推导过程还是挺复杂的。

通过投影操作,所有的3D空间的坐标点都会在近平面上有一对应点,但并不是所有顶点都会落在近平面的那个矩形上的。如下图所示,A点是经过投影得到的位于近平面上的点,它就落在了矩形的外面了。这时OpenGL会怎么做呢?接下来OpenGL就要进行图元的剪裁了。要注意的是,OpenGL并不是把A点直

接舍弃的,而是根据当前三角形图元的三个顶点进行计算,并得到新的三角形图元。如下图所示,通过图元剪裁,三角形ABC被分割成了三角形BCD和三角形CDE。实际的图元剪裁会复杂很多,算法也很多,有兴趣的哥们可以上网搜索下。

通过上一步的图元剪裁,我们好像已经得到了2D屏幕下的四个坐标点BCDE了。然而,是这样吗?注意,图中的近平面,即被投影到的那个平面,并不是实际的屏幕(或者说窗口)。OpenGL还需要针对近平面矩形内的坐标点和屏幕窗口进行一个屏幕映射,貌似也叫视口变换。而真实的屏幕窗口的长宽我们可以通过OpenGLAPI函数进行定义。这个过程我想大家稍微想想也能知道大概是怎么回事,就不细说了。

过年回来就要赶创新文档,没啥准备,难免粗糙了点,见谅啦。下次创新文档我将会给大家介绍投影前的3D空间下的坐标点是如何得来的。准确地说,是观察坐标系下的3D坐标点如何得来,以及上一步OpenGL又在干什么。通过我的这一系列的讲解,我想大家应该就能大概理解一个3DS MAX建模得到的模型,是如何被OpenGL渲染到屏幕上的。

原创粉丝点击