Я пытаюсь визуализировать несколько текстовых меток за один вызов отрисовки. Для этого я передаю матрицы каждой метки в единый массив. Для каждой вершины текстовой сетки передается атрибут «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. Это странно.