如何在 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_VALUE
:size
只能是 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。因此您需要两次 glVertexAttribFormat
或 glVertexAttribPointer
调用来为其设置 VAO。
在着色器中,我想将一个图元数组作为顶点属性传递给它。
在我声明的着色器中
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_VALUE
:size
只能是 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。因此您需要两次 glVertexAttribFormat
或 glVertexAttribPointer
调用来为其设置 VAO。