OpenGL 学习笔记(四)

一、OpenGL shader的编写

        shader是采用GLSL语言编写的,你可能发现了这个语法和C语言非常类似,而且是用字符串格式标注的,简单理解可以说是这样的,在此基础上多了一些例如:OpenGL的版本声明,数据location声明,及专用属性,in,out、vec3等等,同时shader实际上是运行在GPU里的,这意味着,我们无法编写shader的log,但是我们可以在shader编译的时候进行错误检查,具体方法会在以后补充。

着色器的创建、链接及编译

        通过专用的语法glCreateShader及参数,我们便创建shader及获取其对应的id,通过对id操作glShaderSource,我们便将前文编写的shader和对应着色器的进行了绑定,仅仅绑定还不够,还需要glCompileShader来进行编译。

        在OpenGL中,我们有且必有的两个着色器:顶点着色器和片段着色器(又名:片元着色器),两者都是通过相同的三步:glCreateShader、glShaderSource、glCompileShader进行创建。

二、着色器的链接

        我们创建并编译好了顶点着色器和片段着色器,接下来我们还需要将它们合并链接到着色器程序对象,我们在OpenGL中进行的着色器处理,使用的就是着色器程序对象(需要注意的是,着色器的链接到着色器程序对象有严格顺序,上一个着色器的输出,对应下一个着色器的输入,数据对不上就会出错!),着色器程序对象的创建与着色器类似,通过glCreateProgram创建并获取id,根据id,我们使用glAttachShader将各个着色器对象附加上去,最后通过glLinkProgram完成整体链接。

总结来讲通过三步:glCreateProgram、glAttachShader、glLinkProgram

        VAO、VBO、EBO/IBO创建及绘图,VAO,全称Vertex Array Object,顶点数组对象,VBO全称Vertex Buffer Object,顶点缓冲对象,EBO全称Element Buffer Object,IBO全称Index Buffer Object,都指索引数组对象。

        在OpenGL中,我们创建好着色器程序对象,紧接着就需要输入数据,数据的类型如何定义呢?

三、顶点坐标数据

        opengl中的顶点坐标采用的是3D坐标,简单来讲就是空间直角坐标系,对应x,y,z三个方向,你可能发现代码中我们实际顶点数据为(x,y,z,w),w向量是用于透视法处理,作为基础知识,就不展开详谈,但以后我们会具体介绍,如代码中,vertices实际上就装载了我们要绘制的各个点坐标数据,z置为0,就是2D平面坐标,对应平面直角坐标系(需要注意的是,opengl中坐标范围为0-1,所有输入的坐标都需要进行归一化处理)

四、索引数组数据

        代码中的indices数组,可能有人会对此有疑惑,这就是索引点,每一列数据如(0,1,2),对应着顶点坐标数据中的第一行,第二行,第三行数据,这样opengl绘制的时候就会去寻找这三行数据对应的顶点按照绘制图像进行链接,以此类推,我们绘制下一个图像可以反复使用,例如(0,1,3),openlg绘制就寻找第一行,第二行,第四行数据,索引数组在实际项目中经常使用。

五、VBO的含义及创建流程

        我们定义的数组,必须绑定到VBO中才能输入到着色器中。创建流程:我们通过glBindBuffer来绑定对象类型及地址,然后使用glBufferData,将值输入到VBO中

六、VAO的含义及创建流程

        在实际项目中,我们不可能仅仅绘制两个图像,数量过大的时候,每次绘制一个图像,我们都需要实现VBO的调用,绘制会非常复杂,而VAO可以保存VBO对象,比如VAO1对应VBO1,VAO2对应VBO2,在绘制的时候,我们调用VAO1,VAO2...我们就可以将对象的VBO数据都绘制出来。

        创建流程:通过glGenVertexArrays创建VAO1,再在需要绑定的VBO1之前,使用glBindVertexArray绑定VAO1,这样VAO1会对应上后文的VBO1,在绘制的时候,直接调用glBindVertexArray便调用了VBO1的内容。

glVertexAttribPointer函数:

glVertexAttribPointer函数告诉OpenGL该如何解析顶点数据,该函数默认是关闭的,需要通过glEnableVertexAttribArray来开启,其参数对应关系如下:

glEnableVertexAttribArray(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0)

六、EBO/IBO的含义及创建流程

        索引数组对象是实际开发中,我们经常使用的对象,顶点坐标数据可能有几万,或者几十万,这仅仅指的是各个独立点的个数,实际绘制的时候,我们可能需要连接第1、2、3这三个点,然后连接1、2、4这三个点,在代码中我们使用了glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);来告诉opengl我们的顶点数据三个一组,进行后文的glDrawElements中的GL_TRIANGLES以三角形绘制,这里有个问题,opengl仅知道使用三个点,以三角形绘制,那么当绘制有重复点的三角形的时候,它需要重复输入这些顶点数据,我们的顶点数据例如:(0.1f, 0.2f, 0.3f),每多输入一个顶点,就需要多一组顶点数据,在几十万个点的模型中,可能导致多上十几万个点的数据,这将导致内存空间膨胀,和计算过程复杂,所以我们需要引入索引数组对象,它能够告知opengl如何重复利用顶点数组对象里的数据。其创建流程与VBO类似:通过glGenBuffers创建EBO及获取id,通过glBindBuffer和glBufferData,复制索引数组到缓冲中供OpenGL使用,使用glDrawElements,告知opengl以索引绘制图像。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大王算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值