Вершинный шейдер с массивами ввода

Учитывая вершинный шейдер, который выглядит примерно так

#version 400 compatibility

const int max_valence = 6;

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

...

Как правильно отобразить данные на правильные атрибуты вершин? Я пытаюсь использовать VBO, но я не могу понять, как передать это большое значение в. glVertexAttribPointer занимает не более вектора размера 4. Какой правильный способ получить атрибуты вершины в шейдер?

1 ответ

Решение

Массивы атрибутов вершин допустимы в 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.
  );
}
Другие вопросы по тегам