glDrawArrays

关注
义项:OpenGL 顶点数组绘制函数
glDrawArrays

glDrawArrays是OpenGL提供的一个顶点数组绘制函数,用于从已启用的顶点属性数组中顺序读取若干元素,一次性构造并提交多条几何图元。它把逐个顶点调用绘图指令的做法改成一次调用提交一批数据,显著减少了函数调用开销,是 OpenGL 1.1 起就存在的核心绘图接口之一,在 OpenGL ES 等移动图形接口中同样可用。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

glDrawArrays是 OpenGL 图形接口中用于渲染图元的函数,其作用是依照预先设置好的顶点属性数组,绘制一批几何图元[1]。它的 C 语言原型为 void glDrawArrays(GLenum mode, GLint first, GLsizei count),包含 3 个参数[2]。

其中 mode 指定要构造哪一种图元,first 指定在已启用数组中读取的起始下标,count 指定需要渲染的索引数量[3]。调用发生后,函数会从每个已启用数组的第 first 个元素开始,连续取出 count 个元素,按 mode 规定的规则拼装成图元序列[1]。

原理

该函数的作用机制可以概括为一次批量提交。调用前,程序把顶点位置、法线、纹理坐标、颜色等数据分别放入不同的顶点属性数组,并通过启用相应数组和设置数组指针把它们交给 OpenGL[1]。调用 glDrawArrays 时,图形系统按 first 与 count 确定要读取的元素区间,再从每个已启用数组中逐元素取数,由 mode 决定这些元素如何组成点、线或三角形[1]。

从规范角度看,glDrawArrays(mode, first, count) 等价于以实例序号 0 调用单实例绘制过程,即先按下标区间取出顶点数据,再交给顶点着色器逐顶点执行,随后依次进入图元装配、光栅化等后续管线阶段[4]。若顶点着色器所需的某个属性数组未被启用,对应元素将取自当前的通用属性状态值[4]。顶点属性若不足 4 个分量,规范规定会补全:x、y 缺失时补 0,z 缺失时补 0,w 缺失时补 1[4]。

发展历程

glDrawArrays 自 OpenGL 1.1 起即可使用,属于较早引入的批量绘图接口[1]。在 OpenGL 2.1 及更早的参考页中,它被归入 3G 类文档,版权标注为 1991 年至 2006 年由 Silicon Graphics 持有[1]。

随着 OpenGL 版本演进,该函数的可用图元类型不断扩充。OpenGL 3.2 及以上版本新增了带邻接信息的图元常量,如 GL_LINE_STRIP_ADJACENCY、GL_LINES_ADJACENCY、GL_TRIANGLE_STRIP_ADJACENCY 与 GL_TRIANGLES_ADJACENCY[5]。函数本身在 OpenGL 2.0 至 4.5 各版本中均受支持,并同样出现在 OpenGL ES 2.0、3.0、3.1 的参考手册里[2]。

在功能扩展方面,规范定义了 DrawArraysInstanced 与 MultiDrawArrays:前者对同一段元素重复执行多次,并在每次迭代中推进实例编号;后者依次提交多段独立的元素区间[4]。这些命令为 glDrawArrays 的批量思路提供了实例化与多区间两种延伸。

应用

该函数用于把内存中准备好的顶点数据批量送入渲染管线,是三维场景绘制的基础手段之一。相比为每个顶点单独调用 OpenGL 过程,它允许预先指定顶点、法线、颜色等数组,用一次调用构造出一整段图元,因此能减少子程序调用次数[5]。

在具体使用中,它可与缓冲区对象配合工作;当已启用数组绑定了非零缓冲区对象且该缓冲区数据存储正处于映射状态时,调用会产生 GL_INVALID_OPERATION 错误[1]。该函数也可以进入显示列表:若把 glDrawArrays 写入显示列表,由数组指针与启用状态决定的必要数组数据会一并被记录,且这些状态取值以显示列表创建时刻为准,而非执行时刻[2]。

桌面平台方面,Windows 系统为其提供了对应封装,声明于 Gl.h 头文件,使用 Opengl32.lib 库与 Opengl32.dll 动态链接库[3]。

局限

该函数只能按数组中的顺序连续取用顶点元素,无法任意挑选或重复使用下标,因此绘制共享顶点较多的模型时,数据冗余相对明显[1]。需要按索引灵活组织顶点时,通常改用 glDrawElements 一类接口。

它的错误处理也有限制。mode 不是可接受取值时产生 GL_INVALID_ENUM;count 为负数时产生 GL_INVALID_VALUE;若在 glBegin 与对应 glEnd 之间调用,则产生 GL_INVALID_OPERATION[3]。此外,若几何着色器处于活动状态且 mode 与当前程序中几何着色器的输入图元类型不兼容,同样会产生 GL_INVALID_OPERATION[5]。

调用返回后,被修改过的顶点属性取值处于未定义状态;例如启用 GL_COLOR_ARRAY 时,当前颜色值在函数返回后即不再确定,未被修改的属性才保持有定义[1]。若 GL_VERTEX_ARRAY 未启用,则不会生成任何几何图元[1]。

参见

  • OpenGL —— glDrawArrays 所属的图形应用程序接口规范

  • glDrawElements —— 按索引缓冲区组织顶点数据的另一种绘制接口

  • 顶点着色器 —— 接收 glDrawArrays 提交顶点数据的可编程管线阶段

  • 图元装配 —— 把顶点按 mode 规则组合成点、线、三角形的后续阶段

  • OpenGL ES —— 面向嵌入式与移动设备的 OpenGL 子集,同样提供该函数

参考资料

  1. C Specification [引用日期2026-10-14]
  2. glDrawArrays - OpenGL ES 3.1 Reference Pages [引用日期2026-10-14]
  3. glDrawArrays 函式 (Gl.h) [引用日期2026-10-14]
  4. glspec33.core(PDF) [引用日期2026-10-14]
  5. glDrawArrays.3g.en [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T18:44:42Z

历史版本

本条目引用的词条
OpenGL Silicon Graphics glDrawElements 顶点着色器 图元装配 OpenGL ES