OpenGL学习笔记3 (绘制一个简单的三角形)

1.在main.cpp文件中导入头文件以及使用的相关库

引入资源

GLTools.h头文件包含了大部分类似C语言的独立函数

GLUT(OpenGL Utility Toolkit):用于开发独立于窗口系统的OpenGL程序,即该库打包了很多的窗口操作,提供了独立于具体操作系统的API,让你快速的在OpenGL开发中完成窗口相关操作,如窗口显示、输入设备读取、多级级联菜单、多窗口管理等等便捷功能


2.定义两个全局变量

全局变量trangleBatch

说明:GLBatch是一个管理类,帮助我们管理顶点数据(copy顶点,绘制顶点的时候就需要使用它)。

shaderManager着色管理器

说明:GLShaderManager是一个着色管理器,没有着色器,就不能在OpenGL(核心框架中)进行着色,着色器管理器不仅允许我们创建并管理着色器,还提供一组“存储着色器”,它们能够进行一些初步基本的渲染操作。


3.main函数中的准备工作代码

main函数

(1)glutInit函数:GLUT库的初始化方法,传入main函数的参数

(2)glutInitDisplayMode:初始化双缓冲窗口,参数意义:

         GLUT_DOUBLE:表示双缓冲窗口,是指绘图命令实际上是在离屏缓冲区执行的,然后迅速转换为窗口视图,这种方式,经常用来生成动画效果。

         GLUT_RGBA:颜色模式

         GLUT_DEPTH:深度测试,标志一个深度缓冲区分配为显示的一部分,因此我们能够执行深度测试

         GLUT_STENCIL:确保我们也会有一个可用的模板缓冲区

(3)glutInitWindowSize(int width,int height):初始化GLUT窗口大小,width表示宽度,height表示高度。

(4)glutCreateWindow(const char *title):创建窗口并设置窗口标题。

(5)glutReshapeFunc(void (*func) (intint)):窗口首次初始化完成或大小改变时会调用传入其中的回调函数。

(6)glutDisplayFunc(void (*func) ()):系统自动渲染屏幕时(在mac上一秒刷新屏幕60次)会调用传入其中的回调函数。

(7)glewInit()函数以及返回值判断:初始化一个GLEW库,确保OpenGL API对程序完全可用, 在试图做任何渲染之前,要检查确定驱动程序的初始化过程中没有任何问题。

(8)setupRC函数:设置渲染环境

(9)glutMainLoop:这是⼀个⽆限执⾏的循环,它会负责⼀直处理窗⼝和操作系统的⽤户输⼊等操作。(注意:不会执⾏在glutMainLoop()之后的所有命令)。

        以上这些步骤主要是为了创建一个显示窗口,设置窗口大小、窗口模式等信息,类似于你在画画的时候会准备画板、颜料以及画笔等材料。


4.设置绘制前的渲染环境

配置渲染环境

(1)glClearColor函数:设置绘画窗口的背景颜色,传入的四个参数分别为Red(红色)、Green(绿色)、Blue(蓝色)、Alpha(透明度)等值,设定值范围是在0~1之间的浮点数。

(2)shaderManager.InitializeStockShaders():初始化着色管理器中的固定着色器,等会儿绘制的时候可以使用这些固定着色器。

(3)GLfloat类型数组vVerts:三角形顶点坐标数组,每三个一组为三角形一个顶点的表示,其中每一组中第一个浮点数表示顶点坐标在x轴上的位置,第二个浮点数表示顶点坐标在y轴上的位置,第三个浮点数表示顶点坐标在y轴上的位置,因为我们画的只是一个平面图形,所以y轴上的坐标值为0,而这个坐标系的坐标轴的范围分别是x轴从-1到1,y轴也是-1到1,因此这些浮点数要填写为-1至1(闭区间)之间的浮点数就可以了,会按照设定的这个比例在窗口上进行绘制。

(4)triangleBatch.Begin(GL_TRIANGLES, 3):批次类设置顶点数据之前调用,批次容器在添加顶点数据之前,需要在添加前设置顶点连接的连接,并且告诉其顶点的数量,第一个参数GL_TRIANGLES是表示以三角形的方式连接顶点。

(5)triangleBatch.CopyVertexData3f(vVerts):拷贝顶点数据到批次类容器中。

(6)triangleBatch.End():批次类信息设置顶点数据之后调用。


5.添加窗口大小改变时的回调方法

窗口大小改变回调函数

函数的触发条件: 新建窗⼝时或者窗⼝尺⼨发⽣改变时

处理业务: 设置OpenGL 视⼝,设置OpenGL 投影⽅式等. 

glViewport函数:用来设置视口位置以及大小。


6.添加窗口渲染时的回调方法用来绘制图形

渲染图形

(1)glClear(GLbitfield mask)函数:清除一个或一组特定的缓冲区(这个类似于,每次在我们画画之前都要进行清空画板、选择颜料或者画笔等操作),缓存区是一块存储图像信息的的存储空间,红色、绿色、蓝色和alpha分量通常一起作为颜色缓存区或像素缓存区引用,OpenGL中不止一种缓冲区(颜色缓存区,深度缓存区和模板缓存区),清除缓存区对数值进行预置

        三个参数:指定将要清除的缓存

     GL_COLOR_BUFFER_BIT:当前激活的用来进行颜色写入缓存区

     GL_DEPTH_BUFFER_BIT:深度缓存区

     GL_STENCIL_BUFFER_BIT:模板缓存区

(2)GLfloat数组rRed:设置一组浮点数来表示红色,四个参数分别表示RBGA。

(3)shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed):将颜色信息传递到固定着色器,也就是GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标系在屏幕上渲染几何图形。

(4)triangleBatch.Draw():将顶点信息提交到着色器并开始渲染图形。

(5)glutSwapBuffers(): 在计算机渲染图形的过程中,我们并不希望用户看到渲染图片的过程,我们只是希望用户看到渲染图形后的结果,所以这个函数的作用就是等待OpenGL在离屏缓冲区进行图形渲染并且渲染完成后,将屏幕缓冲区与离屏缓冲区进行交换,这样就可以防止用户看到可能伴随着动画帧与动画帧之间的闪烁的渲染过程了。


7.代码运行及结果展示

运行效果

你可能感兴趣的:(OpenGL学习笔记3 (绘制一个简单的三角形))