什么是OpenGL
1. 是一种对图行硬件设备特性进行访问得接口
2. OpenGL不包含任何窗口执行任务,也不包含任何用户输入得处理函数
3. 通过一系列得点线三角形以及面片来创建三维物体
OpenGL1.0与1994年7月发布,到如今已经发布了很多的版本,可以运用与视频游戏,医疗可视化,科学可视化的软件开发,或者只用来显示图像。
OpenGL程序需要执行的基本操作
1.从OpenGL的几何图元中设置数据,用于构建形状
2.使用不同的着色器对输入的的图元数据执行计算操作,判断他们所在的位置,颜色,以及其他的渲染属性
3.将输入图元的数学描述转换为与屏幕对应的像素片元(光栅化)
4.针对光栅化过程产生的每个片元,执行片元着色器,从而决定这个片源最终的颜色和位置
5.如有必要,还需要对每个片元执行一些额外的操作,诸如判断片元是否可见等
所有的OpenGL程序的结构都可以简化为:
1. 初始化物体渲染的状态
2.设置渲染的物体
渲染:表示计算机从模型创建最终图像的过程
OpenGL语法结构
函数----->glBindVertexArrays() 均以gl打头后面跟着多个大写开头的单词
常量------>GL_COLOR 的形式 以GL为前缀+’_‘+名字
数据类型:
C语言没有函数重载:处理方式
如:glUniform glUniform2f glUniform3fv
2f指代两个参数都是float 3fv后缀有V:表示3个参数用一个以为数组的方式进行传递
OpenGL的渲染管线
初始化顶点数据对象
顶点数据对象负责保存顶点数据。
void glCreateVertexArrays(GLsizei n, GLuint *arrays)
返回n个未经使用的对象名到arrays数组中,用作顶点数据对象。
得到对象后可以将其绑定到OpenGL环境中进行使用:
void glBindVertexArray(GLuint array);
完成两项工作:
1. 若array非空,且为glCreareVertexArrays所返回的,那么会激活改array 对象,若不是glCreareVertexArrays返回的或者被glDeleteVertexArray释放就返回GL_INVAILD_OPERATOION错误
2. 若array为0 ,就不再使用之前绑定的对象
void glDeleteVertexArrays(GLsizei n, GLuint *arrays)
删除n个在arrays中定义的顶点数据对象
GLboolean gllsVertexArrays(GLuint array);
如果array是一个使用glCreateVertexArrays创建的且没有删除的对象,则返回
分配缓存对象
顶点数据对象负责保存顶点数据,而这些数据保存在缓存对象当中,并且由当前绑定的顶点数据对象管理
缓存对象的创建同顶点数据对象的创建类似,不过会增加一个向其中增加数据的过程。
1. void glCreateBuffers(GLsizei n, GLunit *buffers);
返回n个当前未使用未使用的的缓存对象名称,并保存在buffers中,若n为负数,则GL_INVAILD_VALUE错误。
2. void glBindBuffer(GLenum target, GLuint buffer)
绑定缓存到OpenGL环境,由于OpenGL中有多种缓存对象,target指明不同的缓存对象GL_ARRAY_BUFFER
1)若绑定一个已经创建的缓存对象,那么buffer将在当前target中被激活
2)若buffer值为0,那么当前target该不再使用任何缓存对象
3. void glDeleteBuffer(GLsizei n, GLuint *buffer);
删除n个保存在buffer中的缓存对象。
4. GLboolean gllsBuffer(GLuint buffer)
若buffer是一个已经分配的的对象且没有释放的对象,则返回GL_TRUE
5.将数据载入缓存对象
void glNamedBufferStorage(GLuint buffer, GLSizeiptr size, const void *data, GLbitfield flags)
作用与buffer的缓存区域,size表示存储数据的总数量,这个数据等于data中的元素的总数乘以单位元素的存储空间的结果,data要么是一个客户端内存的指针,以便初始化缓存对象,要么是NULL,如果传入指针合法,将会有size大小的指针从客户端拷贝值服务端,如果为,那么将保留size大小的未初始化的数据,以备后用,flags提供了缓存中存储数据相关的用途信息
初始化顶点和片元着色器
每个OpenGL程序至少需要两个着色器:顶点着色器 偏远着色器,通过一个辅助函数loadShaders()来实现这个要求,需要输入一个shaderinfo结构题的数据
GLSL就是构成着色器的变成语言
顶点着色器
#version 400 core //指定所用的OpenGL着色语言的版本
//450表示使用OpenGL 4.5的GLSL的着色语言版本 core表示使用核心模式
layout( location = 0 ) in vec4 vPosition; //in 为输入变量
//vPosition为变量的名字,用v作为前缀表明为顶点的位置信息
//vec4 为vPosition的数据类型 为GLSL的四维浮点数向量
//layout( location = 0)为布局限定符,目的是为变量提供元数据
void main()
{
gl_Position = vPosition; //顶点着色器指定的输出位置 gl_Position
}
该段着色器代码负责将输入数据拷贝至输出数据。
片元着色器
#version 450 core // 使用OpenGL 4.5 版本GLSL 使用core核心模式
layout (location = 0 ) out vec4 fColor; //变量声明为 vec4类型的fcolor变量
//使用out限定符,着色器将会将fcolor对应的数据输出
void main()
{
fColor = vec4(0.5, 0.4, 0.8, 1.0); //设定片元颜色,使用了RGBA颜色空间
}
为了输入顶点着色器的数据,需要在着色器中定义in变量然后使用glVertexAttribPointer()将他关联到一个顶点属性数组。
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized,
GLsizei stride, const GLvoid * pointer);
设置index位置对应的数值,point表示从其实位置开始计算的数组数据偏移值,size表示顶点需要更新的的分量数目,type指定每个数组每个元素的数据类型,normalized设置顶点数据在存储前是否需要进行归一化stride是数组在每个元素键的大小偏移值,若为0,则元素紧密的封装在一起。
void glEnableVertexAttribArray(GLuint index);
启用顶点属性数组,同时将glVertexAttirbPointer()初始化的数组指针索引传入这个函数,
渲染
void glClearBufferfv(GLenum buffer, GLuint drawbuffer, const GLfloat*value);
清除当前绘制帧缓存中的指定缓存类型,清除结果为value,参数buffer指定清除的类型,可以是GL_COLOR, GL_DEPTH , GL_STENCIL,drawbuffer设置要清除的缓存索引。
void glDrawArrays(GLenum mode, GLint first, GLsizei count);
使用当前绑定的顶点数据元素来建立一系列的集合图元。起始位置为first,结束位置为first+count-1,mode为构建图元的类型,可以为GL_POINTS GL_LINES GL_TRIANGLES
启用和禁用OpenGL的操作
void glEnable(GLenum capability) void glDisable(GLenum capability)
glEnable开启 glDisable关闭