录十六

持之以恒

使用freeglut搭建OpenGL环境

一、什么是GLUT工具库

GLUT英文全称是OpenGL Utility Tookit,它是Mark J.Kilgard为了简化OpenGL窗口的创建,而开发出来的一个工具库。GLUT是开源的,同时也是独立于操作系统的。对于OpenGL开发,它不是必须的,但是它可以使我们很容易的创建出OpenGL窗口,而无需关注操作系统相关的窗口模块。

二、GLUT库和freeglut库的区别

GLUT库和freeglut库两者都是开源的,它们都是为了能让初学者更好地学习OpenGL而开发的窗口工具包。GLUT是一个非常古老的库,而且已经没有人维护了。后来就有好心的人士又开发了freeglut库,它所有的函数接口都和GLUT保持一致,并且新增了一些接口。因此,它比GLUT功能更加强大,并且完全可以替代GLUT库。

二维纹理映射

二维纹理映射


3D中的平移和缩放变换

前面绘制三棱锥时,为了将模型移动到视景体范围内,我们修改了模型的顶点坐标。如果要在场景不同的位置渲染多个模型,直接修改模坐标显然是不合理的。为了解决这个问题,就需要引入模型变换的概念。

一、世界坐标系和模型坐标系

世界坐标系是一种特殊的坐标系,它建立了描述其它坐标系所需的参考框架。也就说要描述其它坐标系,必须依赖世界坐标系,而无法用其它坐标系来描述世界坐标系,因此它也叫全局坐标系。

模型坐标系是和特定模型相关联的坐标系。在定义一个三维模型,或者通过其它3D软件建立三维模型时,一般都需要以模型自身的中心建立坐标系的,然后在这个坐标系下构建三维模型。以模型自身建立的坐标系叫做模型坐标系,模型在模型坐标系下的坐标,叫模型坐标(也叫局部坐标)。

OpenGL正交投影矩阵的推导

在正交投影下,物体和观察者之间的距离并不影响它的看上去的大小,这种类型的投影常用于工业制图和计算辅助设计等。因为在这类应用中,物体经过投影过后,保持它们的实际大小和它们之间的角度才是至关重要的。

一、平面上的正交投影

已知点P为平面上确定的一点,平面的法向量为N,则平面上的任意一点M满足平面的点法式方

OpenGL透视投影矩阵的推导

一、平面上的透视投影

已知点P为平面上确定的一点,平面的法向量为N,则平面上的任意一点M满足平面的点法式方程:

N • (M - P) = 0

已知观察点为E

绘制三棱锥

一、3D笛卡尔坐标系

3D笛卡尔坐标系与我们常见2D笛卡尔坐标系相同,但是增加了一条Z轴。这三条轴互相垂直,坐标系有3个自由度。要定义3D空间中的一点P,需要三个坐标:x,y,z,或简写P(x,y,z)。另外,这三条轴构成了三个平面:x-y平面,x-z平面和y-z平面,每个平面将空间分成两个区域(半空间),这三个平面最终将整个空间分成8个子空间,也就是8个卦限。

颜色渐变三角形

三角形的颜色,一直在片段着色器中写的,通过程序设置三角形绘制的颜色。

会旋转的三角形

旋转三角形

一、从文件读取着色器源码

为了将着色器对象封装的更易于使用,可以创建一个顶点着色器类MCVertexShader和一个片段着色器类MCFragmentShader,它们分别从MCShader类继承。创建不同类型的着色器对象时,只有调用glCreateShader函数传递的着色器类型参数不一样。因此,可以在MCShader类抽象出一个创建着色器句柄的纯虚函数。

绘制第一个三角形

前面,我们已经成功创建了一个可执行的着色程序。现在就可使用它来绘制一个最简单的三角形。

一、什么是顶点属性数据?

顶点属性数据也简称顶点数据。例如顶点的坐标,颜色,法线,以及顶点的纹理坐标等,都是顶点属性数据。

顶点属性数据,分为顶点数组常量顶点属性两种。

创建和链接着色程序

之前我们已经创建并编译了必要的着色器对象,接着就需要将它们连接器起来,创建一个可执行的着色程序

一、定义着色程序类

C++
class MCProgram
{
public:
    MCProgram();
    virtual ~MCProgram();
 

Copyright © 1999-2019, lu16.com, All Rights Reserved