具有数组输入的顶点着色器

时间:2012-11-24 03:55:08

标签: opengl glsl shader vbo vertex-shader

给定一个类似于

的顶点着色器
#version 400 compatibility

const int max_valence = 6;

in int valence;
in vec3 patch_data[1 + 2 * max_valence];

...

将数据映射到正确的顶点属性的正确方法是什么?我正在尝试使用VBO,但我无法弄清楚如何传递那么大的值。glVertexAttribPointer最多需要一个大小为4的向量。将顶点属性放入的正确方法是什么?着色器?

1 个答案:

答案 0 :(得分:9)

Arrays of vertex attributes在OpenGL中是合法的。但是,阵列的每个成员都会占用单独的属性索引。它们是连续分配的,从您提供的任何属性索引patch_data开始。由于您使用的是GLSL 4.00,因此您还应使用layout(location = #)明确指定属性位置。

所以,如果你这样做:

layout(location = 1) in vec3 patch_data[1 + 2 * max_valence];

然后patch_data将涵盖从1到1 + (1 + 2 * max_valence)的半开范围内的所有属性索引。

每个数组条目从OpenGL侧开始是单独的属性。因此,您需要为每个单独的数组索引单独调用glVertexAttribPointer

因此,如果内存中的数组数据看起来像13个vec3的数组,紧密包装,那么你需要这样做:

for(int attrib = 0; attrib < 1 + (2 * max_valence); ++attrib)
{
  glVertexAttribPointer(attrib + 1, //Attribute index starts at 1.
    3, //Each attribute is a vec3.
    GL_FLOAT, //Change as appropriate to the data you're passing.
    GL_FALSE, //Change as appropriate to the data you're passing.
    sizeof(float) * 3 * (1 + (2 * max_valence)), //Assuming that these array attributes aren't interleaved with anything else.
    reinterpret_cast<void*>(baseOffset + (attrib * 3 * sizeof(float))) //Where baseOffset is the start of the array data in the buffer object.
  );
}