码迷,mamicode.com
首页 > 其他好文 > 详细

openGL画图函数

时间:2016-05-12 21:18:43      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

OpenGL在画图过程中大致可以分为三步,第一步创建好对应的vertex队列,同时在适当的时机将vertex绑定到GL内部;第二步利用BUFFER_ARRAY向vertex队列提交顶点信息以便对vertex队列进行初始化;第三步则是绑定已经初始化的vertex队列,同时利用对应的画图函数进行绘制。

vertex队列的生成主要利用glGenVertexArrays函数完成,其第一个参数定义需要生成的队列的个数;第二个函数则用于接收生成的vertex队列索引。在生成了顶点队列之后,需要利用glBindVertexArray函数将返回的ID号码给绑定到GL状态机上,这样在下一次调用glBindVertexArray函数之前的所有修改都是针对本次绑定的vertex队列。经过处理之后,需要一种渠道使得程序能够向vertex队列提交数据,GL提供的接口是BUFFER_ARRAY。所有向vertex队列提交的数据都是通过buffer array进行的。程序向buffer array提交数据有两种调用方式,第一种是直接利用glBufferData进行数据提交,这种情况适用于所有的数据信息都在一个数组中,并且类型相同;还有一种情况是利用glBufferSubData来进行提交,但是需要注意的是glBufferSubData并不会分配内存,所以在调用之前需要先调用glBufferData。glBufferData首先根据传递来的信息分配足够的连续内存空间,如果传递的数据指针不为NULL,则会提交数据。而glBufferSubData则会根据offset以及需要提交的数据大小向已经分配好的内存空间中提交数据。最后提交的数据由glVertexAttribPointer来分配给对应的vertex shader语言中的对应属性中,包括顶点位置,以及顶点的颜色。在绘图的时候,GPU会有一个索引将顶点的位置信息和顶点的颜色信息一一对应起来,如果绘图过程中需要自定义顶点位置和顶点颜色的索引值,那么可以生成一个ELEMENT_BUFFER_ARRAY的缓存队列,并向这个缓存队列提交索引信息,那么这位置信息和颜色信息以及索引信息将是一一对应的。最后,通过glEnableVertexAttribArray函数开启其属性队列,使得在后续画图时。到这一步,顶点信息就初始化成功了,所有的数据都只需要等待画图时传递到GPU进行处理。

画图函数有四种形式,第一种是直接利用传递进来顶点数据进行绘图,每次绘制一个图形。该函数主要是利用glDrawArrays实现绘图操作。该函数的第一个参数用于指定需要绘制的类型,然后是vertex队列中的偏移量,也就是绘制操作从vertex队列中的第几个元素开始绘制,接下来绘制的顶点的个数。该函数属于最原始的绘制操作,由用户指定顶点,后续的操作不需要程序员参与。

还有一种相对于这个稍微复杂一些的方式,利用程序员提交的索引数据指引程序绘图。该方式利用glDrawElements函数实现,由于该函数并没有强制指定索引的数据类型,所以需要一个额外的参数来制定索引数据的类型值,剩下的三个参数和glDrawAarrays函数的参数一样。同时,由于ELEMENT_BUFFER_ARRAY的存在,使得程序员对队顶点数据的掌控更灵活,程序员可以利用排除法来命令绘制中止之后继续开始。这样的实现是通过glPrimitiveRestartIndex函数实现的,该函数指定一个索引值,在绘制过程中遇到指定的索引值之后,将会停止当前的绘制并重新启动绘制操作,从而避免多次调用glDrawsElement。不过在使用对应的功能之前,需要在GL状态机中开启该项功能——glEnable(GL_PRIMITIVE_RESTART)。

第三种方式也是利用索引队列进行绘图,不过相对于glDrawElement函数增加了一个参数用于设定每次递增的步长,功能通过调用glDrawElementsBaseVertex函数实现。第四种方法则是利用实例化来对绘制多个相同的目标。glDrawArraysInstanced会根据之前的设置来进行实例化渲染,在初始化顶点参数时需要制定实例化更新的平率,glVertexAttribDivisor函数有两个参数,第一个是对应的顶点数据的ID,第二个用于设置更新的频率,如果第二个参数设置为1,那么每一个绘制出来的图像的目标都运用不同的参数进行实例化。而glDrawArrayInstaced函数的第四个参数则指定需要实例化多少个目标——也就是需要绘制多少个目标出来。


——————————————————————————————————


除了上面的glBufferData以及glBufferSubData能够向顶点shade传递数据之外,还存在两种其他的方式进行数据传递。第一种是利用glMapBuffer将buffer array中的缓存给映射出来,glMapBuffer会映射得到之前分配好的数据。当对应的buffer array的ID号和相应的顶点shade中的属性对应时,实际填充的数值将会对顶点shade中的属性起作用。第二种方式是利用glGetUniformLocation得到对应的uniform属性的地址,然后在需要设置位置的时候,利用glUniformMatrix4fv之类的函数进行数据提交,从而达到实现修改对应的属性数值的效果。



openGL画图函数

标签:

原文地址:http://blog.csdn.net/dayenglish/article/details/51350731

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!