- OpenGL顶点规范和绘图命令 Vertex Specification and Drawing Commands
- 图元类型 Primitive Types
- 当前顶点属性值 Current Vertex Attribute Values
- 顶点数组 Vertex Arrays
- 通用顶点属性的数组 Specifying Arrays for Generic Vertex Attributes
- 顶点属性除数 Vertex Attribute Divisors
- 使用顶点数组绘制命令 Drawing Commands Using Vertex Arrays
- 条件渲染 Conditional Rendering
这一部分介绍了顶点数组和顶点数组对象。
顶点数组
顶点数据被放置在存储在服务器地址空间中的数组中。然后,可以使用这些数组中的数据块通过执行单个GL命令来指定多个几何原语。表示顶点数组的所有状态都存储在一个顶点数组对象中。
顶点数组对象
顶点数组对象的命名空间是无符号整数,其中零由GL保留。
以下是一些与顶点数组对象相关的命令:
-
void GenVertexArrays( sizei n, uint *arrays );
:生成 n 个未使用的顶点数组对象名,并将它们存储在数组arrays
中。 -
void CreateVertexArrays( sizei n, uint *arrays );
:创建 n 个未使用的顶点数组对象名,并将它们存储在数组arrays
中。 -
void DeleteVertexArrays( sizei n, const uint *arrays );
:删除 n 个顶点数组对象。删除的对象将不再包含任何内容,并且其名称再次未使用。 -
void BindVertexArray( uint array );
:绑定顶点数组对象。该命令可以创建新的顶点数组对象,也可以绑定现有的顶点数组对象。 -
boolean IsVertexArray( uint array );
:检查一个对象是否是顶点数组对象。glGenVertexArrays 与 glCreateVertexArrays 的区别 `glGenVertexArrays` 仅仅是生成顶点数组对象的名称,实际上并没有创建这些对象的状态。它只是为顶点数组对象分配名称,并且可以在后续的操作中使用这些名称。 `glCreateVertexArrays` 除了生成顶点数组对象的名称外,还会为每个生成的对象创建相应的状态。这包括顶点属性状态、元素数组缓冲状态等。生成的对象不仅仅是名称,还是可以直接使用的顶点数组对象。
-
void VertexArrayElementBuffer( uint vaobj, uint buffer );
:用于将指定的缓冲区对象(Buffer Object)绑定到顶点数组对象(Vertex Array Object,VAO)的元素数组缓冲绑定点。uint vaoID, eboID; CreateVertexArrays(1, &vaoID); // 创建一个顶点数组对象 BindVertexArray(vaoID); // 将该对象绑定为当前上下文的状态 // ... 设置顶点属性指针、启用或禁用顶点属性数组等操作 ... CreateBuffers(1, &eboID); // 创建一个元素数组缓冲对象 BindBuffer(ELEMENT_ARRAY_BUFFER, eboID); // 将该缓冲对象绑定为当前上下文的状态 // ... 设置元素数组缓冲数据 ... VertexArrayElementBuffer(vaoID, eboID); // 将元素数组缓冲对象绑定到顶点数组对象 // ... 现在,所有与绘图操作相关的元素数组数据将使用 eboID 对应的缓冲对象 ...
传递数组元素
当DrawArrays、DrawElements或其他下面描述的Draw*命令将顶点传输到GL时,每个通用属性都会扩展为四个分量。
- 如果
size
为1,那么属性的x分量由数组指定;y、z和w分量被隐式设置为0、0和1。 - 如果
size
为2,则属性的x和y分量由数组指定;z和w分量被隐式设置为0和1。 - 如果
size
为3,则指定了x、y和z,而w被隐式设置为1。 - 如果
size
为4,则所有分量都被指定。
图元重启
在OpenGL和其他图形API中,“Primitive Restart” 是一个用于简化复杂图元(如线条串、三角形列表或扇形)绘制过程的功能。它允许开发者在顶点数组中插入一个特定的索引值,以表示当前图元序列的结束,并从下一个索引开始一个新的图元序列。
具体来说,在使用 DrawElements
或类似的命令时,可以启用 primitive restart 功能,并设置一个重启索引值。当索引数组中出现这个预定义的重启值时,OpenGL将忽略之前连续的索引,并开始处理新一批索引以形成新的几何图元。
例如,在绘制长串的三角形列表时,如果启用了primitive restart,且重启索引值被设置为 0xFFFFFFFF
(对于无符号整数类型)或 0xFF
(对于较小索引大小),那么当索引数组中出现这个值时,OpenGL会中断当前的三角形链,然后从该值之后的索引继续构建新的三角形链。
启用primitive restart功能通常通过调用:
glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(restartIndexValue);
其中 restartIndexValue
就是你指定的重启索引值。这样可以帮助避免创建多个绘图调用,特别是对于那些需要动态生成或条件性连接在一起的图元序列。
健壮访问 Robust Buffer Access
Robust Buffer Access 引入了一些机制,以确保在访问缓冲区时不会导致OpenGL应用程序崩溃或产生不可预测的行为。这对于提高OpenGL程序的可靠性和稳定性非常重要。
// 检查是否支持 Robust Buffer Access
if (glIsExtensionSupported("GL_ARB_robust_buffer_access")) {
// 启用 Robust Buffer Access 特性
glEnable(GL_ARB_robust_buffer_access);
}