通俗的说OpenGL画图原理2
来源:互联网 发布:网页登录sql注入语句 编辑:程序博客网 时间:2024/06/03 09:26
通俗的说OpenGL画图原理2
我的上一篇创新文档讲了OpenGL是如果根据2D屏幕坐标点来绘制图像的,以及从大方面来解释了为什么需要使用OpenGL,而不是仅仅使用Canvas之类的绘图方式。当然,正如我上次所说,所有观点只是我对OpenGL的一种理解,难免有一定的错误和不严谨,希望大家谅解。
这篇创新文档我们来看看,光栅化用到的2D屏幕的坐标点是如何得来的,以及OpenGL在光栅化之前又做了什么操作。
OpenGL在光栅化之前的工作主要是进行投影、图元剪裁和屏幕映射。我发现到这一步的时候我就已经不太好讲解了,尽力而为吧。首先,我们明确下什么是三角形。我们说“三角形”,那只是人类的表达方式,计算机并不认那三个汉字,因此,“三角形”对应到计算机中应该是三个坐标顶点,并且以“三角形”的样子对这三个顶点进行处理。三角形是OpenGL能够处理的其中一种图元,其它的图元如点、线段、四边形、多边形等,具体先不介绍。可以这么说,一个3D空间中的三角形(准确地说,是位于观察坐标系或者眼睛坐标系中的三个坐标顶点),经过投影、图元剪裁和屏幕映射,就得到了2D屏幕下的坐标点。
我们先讲投影是怎么回事,如下图所示,为一个透视投影的模型。我们先不要过于关注图中的6个平面,你只需要知道,它们是可以通过OpenGL的API函数来进行确定的,并对图像的效果会有一定的影响,但不影响绘制过程。图中
的A点即为3D空间中的坐标顶点,通过它往视点连线,这根直线肯定会与近平面相交于一点,如图中的点B。这样就完成了投影操作。很简单吧?实际上,这个过程是由OpenGL通过矩阵运算完成的,该矩阵被称为齐次投影矩阵,由用户通过OpenGL的API函数进行确定,具体矩阵推导过程还是挺复杂的。
通过投影操作,所有的3D空间的坐标点都会在近平面上有一对应点,但并不是所有顶点都会落在近平面的那个矩形上的。如下图所示,A点是经过投影得到的位于近平面上的点,它就落在了矩形的外面了。这时OpenGL会怎么做呢?接下来OpenGL就要进行图元的剪裁了。要注意的是,OpenGL并不是把A点直
接舍弃的,而是根据当前三角形图元的三个顶点进行计算,并得到新的三角形图元。如下图所示,通过图元剪裁,三角形ABC被分割成了三角形BCD和三角形CDE。实际的图元剪裁会复杂很多,算法也很多,有兴趣的哥们可以上网搜索下。
通过上一步的图元剪裁,我们好像已经得到了2D屏幕下的四个坐标点BCDE了。然而,是这样吗?注意,图中的近平面,即被投影到的那个平面,并不是实际的屏幕(或者说窗口)。OpenGL还需要针对近平面矩形内的坐标点和屏幕窗口进行一个屏幕映射,貌似也叫视口变换。而真实的屏幕窗口的长宽我们可以通过OpenGL的API函数进行定义。这个过程我想大家稍微想想也能知道大概是怎么回事,就不细说了。
过年回来就要赶创新文档,没啥准备,难免粗糙了点,见谅啦。下次创新文档我将会给大家介绍投影前的3D空间下的坐标点是如何得来的。准确地说,是观察坐标系下的3D坐标点如何得来,以及上一步OpenGL又在干什么。通过我的这一系列的讲解,我想大家应该就能大概理解一个3DS MAX建模得到的模型,是如何被OpenGL渲染到屏幕上的。
- 通俗的说OpenGL画图原理2
- 通俗的说OpenGL画图原理
- 通俗的说OpenGL画图原理3
- 通俗的说OpenGL画图原理
- 通俗、有逻辑的写一篇说下Xgboost的原理,供讨论参考
- 通俗的说“云计算”(转)
- Spring的IOC原理[通俗]
- 最通俗的ping原理
- OpenGL(2)-3D绘图通俗解释
- 【Rxjava】通俗说Rxjava
- opengl 实现最小化的画图系统
- Spring的IOC原理[通俗解释一下]
- Spring的IOC原理[通俗解释一下]
- Spring的IOC原理[通俗解释一下]
- Spring的IOC原理[通俗解释一下]
- Spring的IOC原理[通俗解释一下]
- 最通俗的CRC校验原理剖析
- Spring的IOC原理[通俗解释一下]
- INSERTED和DELETED表有何区别(备记)
- POSIX多线程——基本线程管理函数介绍
- PE文件头
- kdump转储的内核实现(转)
- 基于CVS的分支开发
- 通俗的说OpenGL画图原理2
- 需求分析
- ASP错误提示大全,让你快速找出错误,希望能给大家事来帮助。
- ASP连接数据库的5种方法
- Listing 3 Linker script for STM32F10x devices
- 字符串匹配算法SMA 总结之四:自动机算法
- smarty 模板中 使用 对象 调用对象 方法
- 数字与字符串之间的转换 (.toString,parseInt,parseFloat)
- [QT]QT教程之实例分析[五]堆栈窗体 (QStackedWidget)