关于 glVertexAttrib... 函数的混淆

3 opengl

经过大量搜索后,我仍然对这些glVertexAttrib...函数(glVertexAttrib1dglVertexAttrib1f等)的作用及其用途感到困惑。

我目前通过阅读这个问题文档的理解是,它们的目的是以某种方式将顶点属性设置为常量(即不使用数组缓冲区)。但文档还讨论了它们如何与“通用顶点属性”交互,定义如下:

通用属性被定义为组织成数组的四分量值。该数组的第一个条目编号为 0,数组的大小由与实现相关的常量 GL_MAX_VERTEX_ATTRIBS 指定。可以使用 glVertexAttrib 调用来修改此数组的各个元素,该调用指定要修改的元素的索引以及该元素的值。

它说它们都是“四分量值”,但完全有可能具有比顶点属性中的分量更多或更少的分量。

这句话究竟是什么意思?这仅适用于vec4类型吗?“通用顶点属性”的索引是什么?一个清晰的解释可能是我真正需要的。

der*_*ass 8

在 OpenGL 中,顶点被指定为一组顶点属性。随着可编程管道的出现,您有责任编写自己的顶点处理功能。顶点着色器确实处理一个顶点,并获取该特定顶点的属性作为输入。

这些顶点属性称为通用顶点属性,因为它们的含义完全由您作为应用程序程序员定义(与传统的固定函数管道相反,其中属性集完全由 GL 定义)。

OpenGL 规范要求实现者支持至少 16 种不同的顶点属性。所以每个顶点属性都可以通过它的索引来标识(或者您的实现允许的任何限制,请参阅glGet(GL_MAX_VERTEX_ATTRIBS,...))。

顶点属性在概念上被视为四维向量。当您在着色器中使用 less 时vec4,附加元素将被忽略。如果您指定元素少于 4 个,则向量始终填充到(0,0,0,1),这对于 RGBA 颜色向量以及同质顶点坐标都有意义。

虽然你可以声明顶点属性mat类型的顶点属性,但这只会映射到许多连续的顶点属性索引。

顶点属性数据可以来自顶点数组(现在,这些数据需要位于顶点缓冲区对象中,可能直接位于 VRAM 中,在传统 GL 中,它们也可能来自普通客户端地址空间)或来自当前该属性的。您可以通过启用从属性数组中获取glEnableVertexAttribArray。如果启用了在顶点着色器中访问的特定属性的顶点数组,则 GPU 将在处理顶点i时从该数组中获取第 i个元素。对于您访问的所有其他属性,您将获得该数组的当前值。

当前glVertexAttrib[1234]*可以通过GL 函数系列设置。它们在绘制调用期间无法更改,因此它们在整个绘制调用期间保持不变保持不变- 就像统一变量一样。

值得注意的一件重要事情是,默认情况下,顶点属性始终是浮点型,您必须在顶点着色器中in float声明 ///vec2才能访问vec3它们。vec4设置当前值,例如glVertexAttrib4ubv或用作GL_UNISGNED_BYTE参数typeglVertexAttribPointer改变这一点。数据将自动转换为浮点型。

如今,GL 确实支持另外两种属性数据类型:32 位整数和 64 位双精度浮点值。您必须在着色器中分别将它们声明为int/ ivec*uint/uvec*double/ dvec*,并且在设置数组指针或当前值时必须使用完全独立的函数:glVertexAttribIPointerglVertexAttribI*对于有符号/无符号整数以及 glVertexAttribLPointerglVertexAttribL*对于双精度数(“长浮点数”) 。