Между этими белыми линиями не должно быть пробелов. Эти линии состоят из квадратов (в конечном итоге я не буду генерировать только один гигантский квадрат, это для отладки). По какой-то причине, когда я отправляю данные через свой Uniform Buffer Object (пример ниже), я получаю пробелы. Это почти так, как если бы он пропускал все другие значения y. На каждом месте на самом деле есть два квадрата, а не один (y) и один на (y + 1).
Создание массива указателей данных
blockData = new glm::vec2[24*24];
for (int x = 0; x < 24; x++) {
for (int y = 0; y < 24; y++) {
int i = x * 24 + y;
blockData[i] = glm::vec2(x, y);
}
}
В классе рендеринга
glBindBuffer(GL_UNIFORM_BUFFER, ubo);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::vec2) * blocksActive, blockData);
glBindBufferRange(GL_UNIFORM_BUFFER, uniBlockData, ubo, 0, sizeof(glm::vec2) * blocksActive);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
glBindVertexArray(vao);
glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)0, blocksActive);
glBindVertexArray(0);
Vertex Shader (GLSL)
layout (std140) uniform blockData {
vec2 blockDataPosition[5184];
};
blockData[i] = glm::vec2(x, y);
to blockData[i] = glm::vec2(y, x);
(переключение y и x), промежутки перемещаются к оси x.int я = x * 24 + y;
Ну, так что происходит, скорее всего, проблема выравнивания. Используя std140, вы должны выровнять по 4 поплавкам. Однако, не видя всего вашего кода, я не буду полностью уверен в том, как вы буферизируете свои данные. Однако я могу предложить вам запросить смещения блока с помощью glGetActiveUniformsiv, а затем выровнять ваши объекты на основе этого. Таким образом, типичным примером может быть следующее:
char* bufferNames[] = [generate the values with a for loop, this should be pretty easy with string and sprintf e.g "blockData.blockDataPosition[0]" to "block.Data.blockDataPosition[5184]"];
GLuint uniformBlockIndex = glGetUniformBlockIndex(yourprogram, "block name");
GLuint uniformIndices[number of names in bufferNames];
glGetUniformIndices(yourprogram, the number of names in bufferNames, bufferNames, indices);
GLint uniformOffsets[the number of names in bufferNames];
glGetActiveUniformsiv(yourprogram, 1, &uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);
Смещения расскажут вам все, что вам нужно знать. Это число смещений в байтах для каждого имени. И вы можете использовать цикл for для заполнения каждого смещения или просто распечатать его, чтобы увидеть, как все выровнено. Это не должно выполняться в цикле, но один раз для инициализации и т.д. Скажите мне, есть ли у вас какие-либо вопросы или вам нужен более конкретный пример.