OpenGL顶点规范和绘图命令:当前顶点属性值 Current Vertex Attribute Values

本文详细介绍了OpenGL中的顶点规范、当前顶点属性值的管理、通用顶点属性数组的声明和修改,以及与之相关的绘图命令,包括条件渲染。着重讲解了顶点数组、属性查询和必需状态等内容。
摘要由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

本节介绍用于指定当前属性值的命令。这些值由绘图命令使用,用于定义在未启用定义所需属性的顶点数组时传输的属性。

当前通用属性

顶点着色器(见第11.1节)访问一个包含4个分量的通用顶点属性数组。这个数组的第一个插槽编号为零,数组的大小由实现相关的常量MAX_VERTEX_ATTRIBS的值确定。

通用着色器属性声明为浮点标量、矢量或矩阵的当前值可以随时通过以下命令之一来更改:

  • void VertexAttrib{1234}{sfd}( uint index, T values );
  • void VertexAttrib{123}{sfd}v( uint index, const T *values );
  • void VertexAttrib4{bsifd ub us ui}v( uint index, const T *values );
  • void VertexAttrib4Nub( uint index, ubyte x, ubyte y, ubyte z, ubyte w );
  • void VertexAttrib4N{bsi ub us ui}v( uint index, const T *values );
  • void VertexAttribI{1234}{i ui}( uint index, T values );
  • void VertexAttribI{1234}{i ui}v( uint index, const T *values );
  • void VertexAttribI4{b s ub us}v( uint index, const T *values );
  • void VertexAttribL{1234}d( uint index, const T values );
  • void VertexAttribL{1234}dv( uint index, const T *values );
  • void VertexAttribP{1234}ui(uint index,enum type,boolean normalized,uint value);
  • void VertexAttribP{1234}uiv(uint index,enum type,boolean normalized,const uint *value);

VertexAttrib4N* 命令指定将转换为标准化 [0, 1] 或 [−1, 1] 范围的定点值,具体转换方式参见方程2.1和2.2。VertexAttribI* 命令指定将被存储为有符号或无符号整数的定点值。VertexAttribL* 命令指定将被存储为双精度值的定点值。VertexAttribP* 命令指定最多四个属性分量值,打包到单个自然类型 type 中,具体描述见第10.3.8节。

顶点属性查询

void GetVertexArrayiv( uint vaobj, enum pname, int *param )

要查询顶点数组对象的参数,使用以下命令:

void GetVertexArrayiv(uint vaobj, GLenum pname, GLint *param);

其中:

  • vaobj 是顶点数组对象的名称。
  • pname 是要查询的参数名称,必须为 ELEMENT_ARRAY_BUFFER_BINDING
  • param 是一个指向存储查询结果的整数的指针。

这个命令允许你查询顶点数组对象的 ELEMENT_ARRAY_BUFFER_BINDING 参数的值。


void GetVertexArrayIndexediv( uint vaobj, uint index, enum pname, int *param )
void GetVertexArrayIndexed64iv( uint vaobj, uint index,enum pname, int64 *param )

要查询顶点数组对象的属性参数,请使用以下命令:

void GetVertexArrayIndexediv(uint vaobj, GLuint index, GLenum pname, GLint *param);
void GetVertexArrayIndexed64iv(uint vaobj, GLuint index, GLenum pname, GLint64 *param);

其中:

  • vaobj 是顶点数组对象的名称。
  • index 是要查询的顶点数组对象中的属性索引。
  • For GetVertexArrayIndexediv, pname 是要查询的参数名称,可以是以下之一:
    • VERTEX_ATTRIB_ARRAY_ENABLED
    • VERTEX_ATTRIB_ARRAY_SIZE
    • VERTEX_ATTRIB_ARRAY_STRIDE
    • VERTEX_ATTRIB_ARRAY_TYPE
    • VERTEX_ATTRIB_ARRAY_NORMALIZED
    • VERTEX_ATTRIB_ARRAY_INTEGER
    • VERTEX_ATTRIB_ARRAY_LONG
    • VERTEX_ATTRIB_ARRAY_DIVISOR
    • VERTEX_ATTRIB_RELATIVE_OFFSET
    • VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
    • VERTEX_BINDING_STRIDE
    • VERTEX_BINDING_DIVISOR
    • VERTEX_BINDING_BUFFER
  • For GetVertexArrayIndexed64iv, pname 必须是 VERTEX_BINDING_OFFSET.
  • param 是一个指向存储查询结果的整数或64位整数的指针,取决于所使用的函数。

这些命令允许你查询顶点数组对象的特定属性的参数。


void GetVertexAttrib*()

要查询当前绑定顶点数组对象的属性参数或当前属性值,可以使用以下命令:

  • void GetVertexAttribdv(uint index, enum pname, double *params);
  • void GetVertexAttribfv(uint index, enum pname, float *params);
  • void GetVertexAttribiv(uint index, enum pname, int *params);
  • void GetVertexAttribIiv(uint index, enum pname, int *params);
  • void GetVertexAttribIuiv(uint index, enum pname, uint *params);
  • void GetVertexAttribLdv(uint index, enum pname, double *params);

其中,参数 index 表示属性的索引,pname 表示要查询的属性参数,而返回值则存储在 params 中。

参数 pname 必须是以下之一:

  • VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
  • VERTEX_ATTRIB_ARRAY_ENABLED
  • VERTEX_ATTRIB_ARRAY_SIZE
  • VERTEX_ATTRIB_ARRAY_STRIDE
  • VERTEX_ATTRIB_ARRAY_TYPE
  • VERTEX_ATTRIB_ARRAY_NORMALIZED
  • VERTEX_ATTRIB_ARRAY_INTEGER
  • VERTEX_ATTRIB_ARRAY_LONG
  • VERTEX_ATTRIB_ARRAY_DIVISOR
  • VERTEX_ATTRIB_BINDING
  • VERTEX_ATTRIB_RELATIVE_OFFSET
  • CURRENT_VERTEX_ATTRIB

需要注意的是,除了 CURRENT_VERTEX_ATTRIB 之外的所有查询都返回当前绑定顶点数组对象中存储的值(即 VERTEX_ARRAY_BINDING 的值)。

对于 VERTEX_ATTRIB_ARRAY_BUFFER_BINDINGVERTEX_ATTRIB_ARRAY_DIVISOR 的查询,将请求的属性索引映射到绑定索引,然后通过 VERTEX_ATTRIB_BINDING 状态返回 VERTEX_BINDING_BUFFERVERTEX_BINDING_DIVISOR 的值。

除了 CURRENT_VERTEX_ATTRIB 之外,所有查询都返回关于通用顶点属性数组的信息。通用顶点属性数组的启用状态由 EnableVertexAttribArray 命令设置,并由 DisableVertexAttribArray 命令清除。大小、步幅、类型、归一化标志和未转换整数标志由 VertexAttribPointerVertexAttribIPointer 命令设置。VertexAttribIPointer 始终将归一化标志设置为 FALSE。未转换整数标志由 VertexAttribPointer 始终设置为 FALSE,而由 VertexAttribIPointer 设置为 TRUE。

查询 CURRENT_VERTEX_ATTRIB 返回通用属性索引的当前值。GetVertexAttribdvGetVertexAttribfv 以四个浮点值读取和返回当前属性值;GetVertexAttribiv 以浮点值读取它们并将其转换为四个整数值;GetVertexAttribIiv 以四个有符号整数读取和返回它们;GetVertexAttribIuiv 以四个无符号整数读取和返回它们;而 GetVertexAttribLdv 以四个双精度浮点值读取和返回它们。如果使用一种数据类型读取当前属性值,但是使用不同的数据类型指定了它们,那么查询结果将是未定义的。


void GetVertexAttribPointerv( uint index, enum pname,const void **pointer )
void GetVertexAttribPointerv(uint index, enum pname, const void **pointer);

用于获取属性编号为 index 的顶点属性的指针,将信息存储在指针数组中。

参数 pname 必须是 VERTEX_ATTRIB_ARRAY_POINTER

返回的值是从当前绑定的顶点数组对象中查询得到的。


最后,可以通过调用 GetIntegerv 命令查询绑定到 ELEMENT_ARRAY_BUFFER 的缓冲区,使用参数 ELEMENT_ARRAY_BUFFER_BINDING

必需状态

支持顶点规范的状态包括 MAX_VERTEX_ATTRIBS 个四分量矢量,用于存储通用顶点属性。所有通用顶点属性的初始值为 (0.0, 0.0, 0.0, 1.0)。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值