Экземплярные сетки OpenGL отображаются неправильно, если экземпляры различаютсяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Экземплярные сетки OpenGL отображаются неправильно, если экземпляры различаются

Сообщение Anonymous »

Контекст:
Я работаю над созданием экземпляров в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»