为什么存在不同的glVertexAttribPointer变体?

Hol*_*Cat 12 opengl

glVertexAttribPointer()
glVertexAttribIPointer()
glVertexAttribLPointer()
Run Code Online (Sandbox Code Playgroud)

据我所知,glVertexAttribPointer可以用来代替其他两个.

如果是这样,为什么IL变化存在?

Bor*_*der 15

我在OpenGL Insights中读到过这个

使用时,glVertexAttribPointer()所有内容都会被转换为浮动.虽然glVertexAttribIPointer()只能暴露存储整数的顶点数组,但glVertexAttribLPointer()仅用于双精度数.

正如OpenGL.org页面上的引文所证实:

对于glVertexAttribPointer,如果规范化设置为GL_TRUE,则表示以整数格式存储的值将映射到范围[-1,1](对于有符号值)或[0,1](对于无符号值)当它们被访问并转换为浮点时.否则,值将直接转换为浮点数而不进行标准化.

对于glVertexAttribIPointer,仅接受整数类型GL_BYTE,GL_UNSIGNED_BYTE,GL_SHORT,GL_UNSIGNED_SHORT,GL_INT,GL_UNSIGNED_INT.值始终保留为整数值.

glVertexAttribLPointer指定与使用64位双精度分量声明的着色器属性变量关联的通用顶点属性数组的状态.type必须是GL_DOUBLE.index,size和stride的行为与glVertexAttribPointer和glVertexAttribIPointer相同.


der*_*ass 5

不,它们不能互相代替使用。

传统上,GL的所有顶点属性都是浮点。您可以输入整数数据的事实并不会改变-数据会即时转换为浮点数。该normalized参数控制转换的完成方式(如果启用该转换,则将输入类型的范围映射到规范化的[0,1](对于无符号类型,也称为GL的UNORM)或[-1,1](对于有符号类型(也称为SNORM),如果将其禁用,则将值直接转换为输入整数的最接近的浮点值。

由于这是原始API,因此在引入不同的属性数据类型(整数和双精度)时必须对其进行扩展。还要注意,属性指针与着色器无关,因此目标值不能由当前绑定的着色器(如果有)确定,因为以后可能会与其他着色器一起使用。因此,L变体ID用于double/dvec属性,而I变体用于int/uint/ivec/uvec属性。