如何在 OpenGL 中声明和使用作为原始元素数组的顶点属性

How does one declare and use vertex attributes that are an array of primitive elements in OpenGL

在着色器中,我想将一个图元数组作为顶点属性传递给它。

在我声明的着色器中

in float FloatItems[8]
in int IntItems[8]

在 C++ 代码中使用:

void glGetActiveAttrib(     GLuint program,
    GLuint index,
    GLsizei bufSize,
    GLsizei *length,
    GLint *size,
    GLenum *type,
    GLchar *name);

returns 
    name == "FloatItems[0]"
    size == 1
    type == 0x1406 (GL_FLOAT) - GL_INT for the int one.

当我尝试使用 glVertexAttribPointer 绑定到它的位置时,它失败并显示 0x0501“无效值”

显然 gls 正在创建名称为“FloatItem[0]”的单个属性,而不是大小为 8 个元素的数组 FloatItem。

是否有“正确”的方法来做到这一点??

这个:

in float FloatItems[8]

意味着着色器采用 八个单独的属性,着色器可以将其作为值数组进行访问。这是具有 8 个不同属性位置的 8 个属性。这些属性的位置将从 FloatItems[0].

的位置开始连续分配

显然,为 8 个浮点数消耗 8 个属性位置是对位置和可能其他顶点输入资源的巨大浪费。因此,处理此问题的最佳方法是在属性本身的限制范围内工作。

属性位置最多 4 个元素长(这就是为什么你得到 GL_INVALID_VALUEsize 只能是 1-4)。这表示向量类型中的组件数:2-4,其中 1 是标量版本。

因此,如果您想要一个“8 个浮点数的数组”,您想要的是一个包含两个 vec4 的数组:

layout(location = X) in vec4 FloatItems[2];

要访问数组元素,您可以使用多重索引。要从数组中获取索引 Y,请使用 FloatItems[Y / 4][Y % 4]。使用 4 是因为您使用的是 vec4.

当然这里涉及到两个属性位置。第一个位于位置 X(前 4 个元素),下一个位于位置 X + 1。因此您需要两次 glVertexAttribFormatglVertexAttribPointer 调用来为其设置 VAO。