Как правильно настроить пользовательский индекс как данные атрибута вершины generi c? - PullRequest
2 голосов
/ 23 апреля 2020

Я пытаюсь визуализировать несколько текстовых меток за один вызов отрисовки. Для этого я передаю матрицы каждой метки в единый массив. Для каждой вершины текстовой сетки передается атрибут «labelIndex», чтобы выбрать правильную матрицу из массива.

Но когда я проверяю вход VS в RenderDo c, labelIndex равен 0 для каждой вершины, как если бы это неинициализировано. Чего мне не хватает при настройке атрибута вершины labelIndex?

uint labelIdx = 0;
std::vector<uint> labelIndices;
for (auto& label : Labels)
{
  ... 
  for (unsigned int i = 0; i < wcslen(label.Text); i++)
  {
    ...
    labelIndices.push_back(labelIdx);
    labelIndices.push_back(labelIdx);
    labelIndices.push_back(labelIdx);
    labelIndices.push_back(labelIdx);
  }      
  labelIdx++;
}
glGenBuffers(1, &LabelIndexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, LabelIndexBufferID);
glBufferData(GL_ARRAY_BUFFER, labelIndices.size() * sizeof(uint), &labelIndices[0], GL_STATIC_DRAW);

glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

...

// 2nd attribute buffer : Label indices
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, LabelIndexBufferID);
glVertexAttribIPointer(1, 1, GL_UNSIGNED_INT, 0, (void*)0);

// element buffer
glGenBuffers(1, &ElementBufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ElementBufferID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(uint), &indices[0], GL_DYNAMIC_DRAW);

glBindVertexArray(0);

Рендеринг:

glUseProgram(ShaderID);
...
glUniformMatrix4fv(ParentMatrixLocation, 1, GL_FALSE, glm::value_ptr(Renderer::VP));
glUniformMatrix4fv(LabelMatricesLocation, Labels.size(), GL_FALSE, glm::value_ptr(LabelMatrices.get()[0]));

glBindVertexArray(VertexArrayID);

glDrawElements(
    GL_TRIANGLES,
    CharacterCount * 6,
    GL_UNSIGNED_INT,
    (void*)0
);

glBindVertexArray(0);

Вершинный шейдер:

#version 430 core

layout(location = 0) in vec4 PositionUV;
layout(location = 1) in uint LabelIndex;

uniform mat4 ParentMatrix;
uniform mat4 LabelMatrices[200];
out vec2 UV;

void main()
{
    gl_Position = ParentMatrix * LabelMatrices[LabelIndex] * vec4(PositionUV.xy, 0, 1);
    UV = PositionUV.zw;
}

Редактировать:

Я не знаю, что здесь происходит. Когда я получаю буфер после его заполнения:

uint* data = NULL;
data = new uint[labelIndices.size()];
for (int i = 0; i < labelIndices.size(); i++)
{
    data[i] = 0;
}
glGetBufferSubData(GL_ARRAY_BUFFER, 0, labelIndices.size() * sizeof(TextVertex), data);

Я смотрю на data и для LabelIndex устанавливается соответствующая метка. Но при захвате кадра в RenderDo c LabelIndex по-прежнему равен 0. Когда я инициализирую LabelIndex, скажем, 7, и не увеличиваю его в l oop, LabelIndex будет правильно иметь значение 7 на входе VS. Это странно.

...