上一节已经搭建好了开发环境,在正式学习如何用OpenGL前,我们先了解一下OpenGL的基础知识。
一、OpenGL是什么
一般它被认为是一个API,包含了一系列的函数,用来操作各种图形图像。事实上并不是,OpenGL仅仅是一个由一个名为Khronos组织制定并维护的规范。但是,我宁愿把它当成是API来理解,因为规范严格规定了OpenGL各函数的输入和输出,内部细节都是开发者自行决定。那么以API来理解,我认为是很合理的。(其实OpenGL函数大多是各显卡厂商开发的,所以如果你在用OpenGL开发过程中如果遇到问题,可以尝试更新显卡驱动的方式来解决,当然,前提是你还要确定一下显卡厂商)
如果你想了解OpenGL规范细节,可以访问https://www.opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf。
二、状态机
OpenGL是一个状态机,无论是官方信息还是网络上的信息,都解释的比较繁琐和复杂。
我认为,可以这么理解,当我们用OpenGL去绘制一个三角形时,要把OpenGL当前状态设置成可以绘制三角形的状态,比如颜色、线条啥的,渲染就出来三角形了。如果又想绘制线段了,就把OpenGL当前状态再设置成线段的状态,就可以渲染出线段了。
说白了,就是想绘制啥,就把状态设置先设置成啥,这就是状态机。(这是我自己理解的,哈哈)
三、核心模式与立即渲染模式
OpenGL3.2之前,它都是立即渲染模式,3.2之后,它使用了核心模式,抛弃了立即渲染模式。
那么什么是立即渲染模式,什么是核心模式呢?
我查了网上很多资料,都没有把这个事情说清楚,我通过各种文章,是这么理解的:
立即渲染模式是类似这样:
glBegin( GL_TRIANGLES );
glVertex3f(-1.0f, -0.5f, -4.0f);
glVertex3f( 1.0f, -0.5f, -4.0f);
glVertex3f( 0.0f, 0.5f, -4.0f);
glEnd();
上面是绘制三角形的,具体可以不用追究。只要明白,设置好点,放在glBegin和glEnd之间,就能渲染出来三角形了。这就是立即渲染模式。
而核心模式就要关注细节了,它是如何用点和颜色渲染图形的,都需要开发者参与设计。
暂时我就理解到这个程度,后续边学边理解吧。
四、对象
OpenGL库是用C语言写的,我们知道C语言是面向过程的,之前的OpenGL也是面向过程的,比如,绘制一个图形,就要设置好顶点和颜色,如果再绘制一个,就要再设置一次。而OpenGL引入“对象(Object)”后,就方便多了。比如:
// 创建对象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);
上面这段是在网上抄过来的,不过,说明很详细,我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文(就是设置内容,比如颜色、大小等等)的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。
说白了,就是,创建一个对象,先用一个ID保存起来,并设置好内容,想用了,将这个ID跟设置目标(比如GL_WINDOW_TARGET)绑定,就可以用了,不用每次都重新设置。
好了,这次了解了一些OpenGL的基础,下一次就可以开心正式学习OpenGL了。