glDrawE lements是一个OPENGL的图元绘制函数,从数组中获得数据渲染图元。
函数原型为:
void glDrawElements( GLenum m ode , GLsizei count,
GLenum type, const GLvoid *indices);

其中:
mode指定 绘制图元的类型,它应该是下列值之一,GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, and GL_POLYGON.
count为绘制图元的数量。
type为索引值的类型,只能是下列值之一: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT。
indices:指向索引存贮位置的指针。

glDrawElements 函数能够通过较少的函数调用绘制多个几何图元,而不是通过OPENGL函数调用来传递每一个顶点,法线,颜色信息。你可以事先准备一系列分离的顶点、法 线、颜色数组,并且调用一次glDrawElements把这些数组定义成一个图元序列。当调用glDrawElements函数的时候,它将通过索引使 用count个成序列的元素来创建一系列的几何图元。mode指定待创建的图元类型和数组元素如何如来创建这些图元。但是如果 GL_VERTEX_ARRAY 没有被激活的话,不能生成任何图元。被glDrawElements修改的顶点属性在glDrawElements调用返回后的值具有不确定性,例 如,GL_COLOR_ARRAY被激活后,当glDrawElements执行完成时,当前的颜色值是没有指定的。没有被修改的属性值保持不变。
可 以在显示列表中包含glDrawElements,当glDrawElements被包含进显示列表时,相应的顶点、法线、颜色数组数据也得进入显示列表 的,因为那些数组指针是ClientSideState的变量,在显示列表创建的时候而不是在显示列表执行的时候,这些数组指针的值影响显示列表。 glDrawElements只能用在OPENGL1.1或者更高的版本。
OpenGL快速渲染函数glDrawElements使用说明
OpenGL基本的绘图函数例如glVertex、glNormal等在调试模式下运行时,如果模型的顶点数或者三角面数过大(比如超过一万时),则程序运行速度会非常慢,根本就无法进行正常的调试。 为此查阅了相关资料,找到glArrayElement、glDrawElements这两个个函数。这两个函数都能通过少数几条语句的调用实现大量数据的绘制,从而节省了函数调用的资源占用。

glArrayElement函数用法简单直接,只要把所有的顶点、法向量等 数据,按照三角形的顺序准备好,就可以直接渲染,但缺点是不支持顶点索引,所以内存占用比较大。举例来说,如果一个网格有100个顶点,一般大约会有 200个三角面,如果使用glArrayElement就需要存储200×3=600个顶点的数据,相比原有的数据多了5倍。如果是已经条带化的数据,这 种冗余数据多的可能就不只5倍了。权衡之下还是决定使用glDrawElements函数。

glDrawElements函数支持顶点数据列表,更为方便的是它还支持顶 点索引,所以就成为了快速渲染的首选。可是我在具体使用过程中,却总是没有任何顶点数据被绘制出来,查了相关资料,既不是数据错误,也不是硬件不支持,只 好暂时搁置一边了。一个偶然的机会,我看到某段示例代码,发现glDrawElements中索引数据类型的参数是GL_UNSIGNED_INT,而我 之前用的参数都是GL_INT(因为算法的需要,有时需要存储负数索引,以表示正反方向的不同)。抱着试试看的想法,我把参数改成了 GL_UNSIGNED_INT,结果竟然绘制出图像来了。赶紧查阅了MSDN,对glDrawElements的说明如下:
void glDrawElements(
GLenum mode ,
GLsizei count ,
GLenum type ,
const GLvoid *indices
);
Parameters
mode
The kind of primitives to render. It can assume one of the following symbolic values: GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, and GL_POLYGON.
count
The number of elements to be rendered.
type
The type of the values in indices. Must be one of GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT.
indices
A pointer to the location where the indices are stored.

glDrawElements(函数)相关推荐

  1. OpenGL ES:绘制函数glDrawArrays 和 glDrawElements 的区别

    from:https://www.jianshu.com/p/4d02c2cd21ea 写文章注册登录 首页 下载App OpenGL ES:绘制函数glDrawArrays 和 glDrawElem ...

  2. glDrawElements参数在新旧版本传最后一个参数的不同

    glDrawElements函数如下: void glDrawElements( GLenum mode,GLsizei count,GLenum type,const GLvoid * indice ...

  3. glDrawArrays,glDrawElements用法

    glDrawArrays 和 glDrawElements 的作用都是从一个数据数组中提取数据渲染基本图元.( render primitives from array data ) 注!如果要 gl ...

  4. 关于glDrawElements的使用

    关于glDrawElements的使用 glDrawElements是一个OPENGL的图元绘制函数,从数组中获得数据渲染图元. 函数原型为: void glDrawElements(  GLenum ...

  5. Opengl ES----glDrawArray和glDrawElements

    花了四天的时间, 把一款FPS游戏引擎Fly3D 转到OpenGL ES上, 众所周知, ES是面向移动设备的, 所以,为了效率,它对OpenGL进行了很多的筛减, 把一些没有效率的函数如(glBeg ...

  6. OpenGL API glDrawElements

    glDrawElements是一个OPENGL的图元绘制函数,从数组中获得数据渲染图元. 函数原型为: void glDrawElements( GLenum mode , GLsizei count ...

  7. Learn OpenGL (二):三角形

    知识补充: 顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 索引缓冲对象:Element Buffer Object,EB ...

  8. OpenGL编程指南6:顶点数组

    1.前言 前面的例子中,我们可以看到,OpenGL需要进行大量的函数调用才能完成对几何图元的渲染.绘制一个20条边的多边形至少需要22个函数调用.首先调用一个glBegin(),然后为每个顶点调用一次 ...

  9. GPU Gems2 - 7 带位移映射的细分表面自适应镶嵌

    文章参照该文 https://zhuanlan.zhihu.com/p/38411575 [章节概览] 这章介绍了如何使用可选的位移贴图(Displacement Mapping)执行Catmull- ...

最新文章

  1. 垃圾邮件过滤 php,垃圾邮件过滤功能
  2. magento 修改产品类型的方法 change product type
  3. RabbitMQ的TTL+死信队列 看完这篇包会!!!
  4. 记录自己的第一个稍微有趣一点的小游戏
  5. 【Python】用pip安装python库下载超时的解决办法
  6. 使用微软官方工具MediaCreationTool制作Windows10的U盘系统安装盘
  7. CA证书无法与服务器连接,湖北国税常见CA登陆问题的解决办法
  8. 3D立体显示大屏幕拼接视频墙系统解决方案
  9. 效率低下的不良习惯与解决办法
  10. ping计算机名获取IP
  11. 代码英雄:操作系统之战
  12. 巴比特 | 元宇宙每日必读:蒂芙尼宣布推出限量版 CryptoPunk 定制吊坠
  13. 八股总结(二)计算机网络与网络编程
  14. 幂数加密(云影加密)
  15. iphonex 底部遮挡返回键 解决方法
  16. 如何用adobe audition剪切音频单独导出保存
  17. 可执行 jar 和普通 jar 区别
  18. 大通流TVS管和ESD静电二极管的区别
  19. 面试:你看见一分硬币捡不捡?计算秒薪的回答亮了,网友:我都要
  20. Android input 系统InputReader,InputDispatcher线程实例--UI死掉

热门文章

  1. 高级java开发必问面试题
  2. 即时通讯技术文集(第15期):IM跨平台和社交软件红包技术 [共19篇]
  3. 理解“same-site“ 和 “same-origin“
  4. 复杂公式怎么用计算机计算,Excel复杂公式的两种理解方法!
  5. 职业选择的两种路径:向外求 vs 向内求
  6. 钉钉报错,访问ip不在白名单之中
  7. 微型计算机中H指的是,微机(微型计算机技术及应用)选择题及答案(最终版)...
  8. Fortinet安立方架构获得NSS Labs BDS 组测试多攻击维度100%检出率佳绩
  9. 【左偏树】【bzoj 2333】: [SCOI2011]棘手的操作
  10. 现场应用工程师FAE