- 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
本节介绍用于指定当前属性值的命令。这些值由绘图命令使用,用于定义在未启用定义所需属性的顶点数组时传输的属性。
当前通用属性
顶点着色器(见第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_BINDING
和 VERTEX_ATTRIB_ARRAY_DIVISOR
的查询,将请求的属性索引映射到绑定索引,然后通过 VERTEX_ATTRIB_BINDING
状态返回 VERTEX_BINDING_BUFFER
或 VERTEX_BINDING_DIVISOR
的值。
除了 CURRENT_VERTEX_ATTRIB
之外,所有查询都返回关于通用顶点属性数组的信息。通用顶点属性数组的启用状态由 EnableVertexAttribArray
命令设置,并由 DisableVertexAttribArray
命令清除。大小、步幅、类型、归一化标志和未转换整数标志由 VertexAttribPointer
和 VertexAttribIPointer
命令设置。VertexAttribIPointer
始终将归一化标志设置为 FALSE。未转换整数标志由 VertexAttribPointer
始终设置为 FALSE,而由 VertexAttribIPointer
设置为 TRUE。
查询 CURRENT_VERTEX_ATTRIB
返回通用属性索引的当前值。GetVertexAttribdv
和 GetVertexAttribfv
以四个浮点值读取和返回当前属性值;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)。