OpenGl 概述

什么是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关闭

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值