Я работаю над созданием экземпляров в OpenGL (версия 4.6), используя C++ и SDL для создания окон. Когда я визуализирую несколько экземпляров четырехугольника:
- Если все экземпляры идентичны, рендеринг работает отлично.
- Если Я пытаюсь сделать экземпляры разными (например, используя разные матрицы моделей), экземпляры отображаются неправильно. Кажется, что рендерится только один экземпляр, а вершины смещаются случайным образом.
Код для настройки данных экземпляра:
Код: Выделить всё
std::vector instances;
for (uint32_t i = 0; i < 10; i++) {
int x = i % 10;
int y = i / 10;
if (i == 0) instances.push_back(glm::translate(glm::mat4{ 1.0 }, glm::vec3{5.0, 0.0, 0.0}));
else instances.push_back(glm::translate(glm::mat4{ 1.0 }, glm::vec3{ 0.0, 0.0, 0.0 }));
}
uint32_t instanceBuffer;
glCreateBuffers(1, &instanceBuffer);
glNamedBufferStorage(instanceBuffer, sizeof(glm::mat4) * instances.size(), instances.data(), GL_DYNAMIC_STORAGE_BIT);
uint32_t vao = mesh->vao;
uint32_t location = 3;
for (uint32_t i = 0; i < 4; i++) {
glEnableVertexArrayAttrib(vao, location + i);
glVertexArrayAttribFormat(vao, location + i, 4, GL_FLOAT, GL_FALSE, i * sizeof(glm::vec4));
glVertexArrayAttribBinding(vao, location + i, 1);
glVertexArrayBindingDivisor(vao, location + i, 1);
}
glVertexArrayVertexBuffer(vao, 1, instanceBuffer, 0, sizeof(glm::mat4));
Код: Выделить всё
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(defaultShader->id);
UniformManager::SetMat4(defaultShader, "u_ProjectionView", projectionView);
glBindVertexArray(vao);
UniformManager::SetInt(defaultShader, "u_IsInstance", true);
glDrawElementsInstanced(GL_TRIANGLES, mesh->count, GL_UNSIGNED_INT, nullptr, (uint32_t)instances.size());
Код: Выделить всё
#version 460 core
layout (location = 0) in vec3 vPos;
layout (location = 1) in vec3 vNorm;
layout (location = 2) in vec2 vTexCoords;
layout (location = 3) in mat4 vInstance;
out vec2 vertexUV;
uniform bool u_IsInstance;
uniform mat4 u_ProjectionView;
uniform mat4 u_Model;
void main() {
vertexUV = vTexCoords;
if (!u_IsInstance)
gl_Position = u_ProjectionView * u_Model * vec4(vPos, 1.0);
else
gl_Position = u_ProjectionView * vInstance * vec4(vPos, 1.0);
}
- Проверил, что экземплярBuffer содержит правильные данные ( дважды проверено отладчиком).
- Убедился, что vao правильно настроен с атрибутами и привязками.
- Проверена логика шейдера, которая работает правильно без создания экземпляров .
- Версия OpenGL: 4.6 (с использованием Direct State Access для настройки).
- Визуализация работает нормально, когда все экземпляры идентичны (например, одна и та же матрица vInstance).
- Когда используются разные данные экземпляра, результат выглядит так, как будто только один экземпляр визуализируется, а его геометрия смещается случайным образом.
Правильная отрисовка с идентичными экземплярами:

Неправильный рендеринг с разными экземплярами:

Вопрос:
Почему мой рендеринг прерывается, когда я использую разные данные экземпляра? Я что-то упустил в настройке буфера, выравнивании данных или конфигурации шейдера?
Подробнее здесь: https://stackoverflow.com/questions/792 ... ces-differ