OpenGL顶点规范和绘图命令:顶点数组 Vertex Arrays

本文详细介绍了OpenGL中的顶点数组和顶点数组对象,包括如何创建、绑定和管理这些对象,以及如何使用它们进行条件渲染和处理图元重启。此外,文章还讨论了RobustBufferAccess的引入以增强缓冲区访问的健壮性。
摘要由CSDN通过智能技术生成
  1. OpenGL顶点规范和绘图命令 Vertex Specification and Drawing Commands
  2. 图元类型 Primitive Types
  3. 当前顶点属性值 Current Vertex Attribute Values
  4. 顶点数组 Vertex Arrays
  5. 通用顶点属性的数组 Specifying Arrays for Generic Vertex Attributes
  6. 顶点属性除数 Vertex Attribute Divisors
  7. 使用顶点数组绘制命令 Drawing Commands Using Vertex Arrays
  8. 条件渲染 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值