Контекст:
Я работаю над созданием экземпляров в OpenGL (версия 4.6), используя C++ и SDL для создания окон. Когда я визуализирую несколько экземпляров четырехугольника:
Если все экземпляры идентичны, рендеринг работает отлично.
Если Я пытаюсь сделать экземпляры разными (например, используя разные матрицы моделей), экземпляры отображаются неправильно. Кажется, что рендерится только один экземпляр, а вершины смещаются случайным образом.
Вот соответствующий код для настройки и рендеринга экземпляров: Код для настройки данных экземпляра:
Проверил, что экземплярBuffer содержит правильные данные ( дважды проверено отладчиком).
Убедился, что vao правильно настроен с атрибутами и привязками.
Проверена логика шейдера, которая работает правильно без создания экземпляров .
Дополнительный контекст:
Версия OpenGL: 4.6 (с использованием Direct State Access для настройки).
Визуализация работает нормально, когда все экземпляры идентичны (например, одна и та же матрица vInstance).
Когда используются разные данные экземпляра, результат выглядит так, как будто только один экземпляр визуализируется, а его геометрия смещается случайным образом.
Скриншоты:
Правильная отрисовка с идентичными экземплярами:
Неправильный рендеринг с разными экземплярами:
Вопрос:
Почему мой рендеринг прерывается, когда я использую разные данные экземпляра? Я что-то упустил в настройке буфера, выравнивании данных или конфигурации шейдера?
[b]Контекст:[/b] Я работаю над созданием экземпляров в OpenGL (версия 4.6), используя C++ и SDL для создания окон. Когда я визуализирую несколько экземпляров четырехугольника: [list] [*]Если все экземпляры идентичны, рендеринг работает отлично. [*]Если Я пытаюсь сделать экземпляры разными (например, используя разные матрицы моделей), экземпляры отображаются неправильно. Кажется, что рендерится только один экземпляр, а вершины смещаются случайным образом. [/list] Вот соответствующий код для настройки и рендеринга экземпляров: [b]Код для настройки данных экземпляра:[/b] [code]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 })); }
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); } [/code] [b]Что я пробовал:[/b] [list] [*]Проверил, что экземплярBuffer содержит правильные данные ( дважды проверено отладчиком). [*]Убедился, что vao правильно настроен с атрибутами и привязками. [*]Проверена логика шейдера, которая работает правильно без создания экземпляров . [/list] [b]Дополнительный контекст:[/b] [list] [*]Версия OpenGL: 4.6 (с использованием Direct State Access для настройки). [*]Визуализация работает нормально, когда все экземпляры идентичны (например, одна и та же матрица vInstance). [*]Когда используются разные данные экземпляра, результат выглядит так, как будто только один экземпляр визуализируется, а его геометрия смещается случайным образом. [/list] [b]Скриншоты:[/b] Правильная отрисовка с идентичными экземплярами: [img]https://i.sstatic.net/AJZIHip8.png[/img]
Неправильный рендеринг с разными экземплярами: [img]https://i.sstatic.net/xVkGsIdi.png[/img]
[b]Вопрос:[/b] Почему мой рендеринг прерывается, когда я использую разные данные экземпляра? Я что-то упустил в настройке буфера, выравнивании данных или конфигурации шейдера?