Обе сетки используют одни и те же данные вершин/индексов, но должны иметь отдельные VAO (см. макрос createVAO).
Камера движется правильно и может видеть область, где должен находиться второй куб. Основная проблема, похоже, заключается в цикле рендеринга. Если я поменяю местами отрисовку упорядочите и отобразите солнце перед мм, затем солнце станет видимым, а мм исчезнет. Это говорит о том, что проблема не в самих данных, а в том, как состояние OpenGL управляется во время рендеринга. Минимальный воспроизводимый пример (упрощенный из моего кода):
Вот код, который создан для возражения:
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
cam1.update(); // Updates view matrix
// Update model matrix for first object
mm.update();
UseProgram(mm);
mm.material->shader->set_mat4(mm.modelMatrix, "model");
mm.material->shader->set_mat4(cam1.getviwe(), "view");
mm.mesh->draw(36); // Draws correctly
// Update model matrix for second object
sun.update();
sun.position = glm::vec3(1.5f, 0.0f, 0.0f); // Moved to the side
sun.dirty = true;
UseProgram(sun);
sun.material->shader->set_mat4(sun.modelMatrix, "model"); // shader->set_mat4(cam1.getviwe(), "view");
sun.mesh->draw(36); // Does NOT draw
}
Гарантировать, что sun.update() вызывается для обновления его modelMatrix.
Явно устанавливать модель, униформу для солнца прямо перед рисованием.
Проверка этого sun.mesh->VAO — это ненулевое значение, отличное от mm.mesh->VAO.
Подозрение:
Я подозреваю, что проблема может быть в моих макросах-оболочках или в том, что униформы второго шейдера установлены неправильно из-за конфликта состояний OpenGL. Макрос UseProgram расширяется до glUseProgram(object.material->shader->Get_Porogram()).
Может ли кто-нибудь помочь мне определить, почему состояние отрисовки первого объекта может мешать второму?
Я начинаю с OpenGL и столкнулся с классической проблемой «второй объект не отображается». У меня есть два экземпляра Object ([code]mm[/code] и sun) с, казалось бы, отдельными VAO, VBO, шейдерными программами и текстурами. Однако только первый объект ([code]mm[/code]) появится на экране. Второй ([code]sun[/code]) невидим. [b]Что я проверил/проверил:[/b] [list] [*]Оба объекта имеют уникальные экземпляры ShaderProgram и loadTextures.
[code]glGetError()[/code] не возвращает ошибок после вызовов настройки и отрисовки.
[*]Обе сетки используют одни и те же данные вершин/индексов, но должны иметь отдельные VAO (см. макрос createVAO).
[/list] Камера движется правильно и может видеть область, где должен находиться второй куб. [b]Основная проблема, похоже, заключается в цикле рендеринга[/b]. Если я поменяю местами отрисовку упорядочите и отобразите солнце перед мм, затем солнце станет видимым, а мм исчезнет. Это говорит о том, что проблема не в самих данных, а в том, как состояние OpenGL управляется во время рендеринга. [b]Минимальный воспроизводимый пример (упрощенный из моего кода):[/b] Вот код, который создан для возражения: [code] mm.material->shader->createshader(); UseProgram(mm); mm.material->shader->set_mat4(cam1.getviwe(), "view"); mm.material->shader->set_mat4(projection, "projection"); createVAO(mm); createVBO(mm,posiitions,192); createEBO(mm, indexe,36); setAttrib(mm, 0, 3, 8, 0); setAttrib(mm, 1, 3, 8, 3); setAttrib(mm, 2, 2, 8, 6); load_image(mm); use_image(mm,GL_TEXTURE0); mm.material->shader->set_int(0, "texture1");
// Update model matrix for first object mm.update(); UseProgram(mm); mm.material->shader->set_mat4(mm.modelMatrix, "model"); mm.material->shader->set_mat4(cam1.getviwe(), "view"); mm.mesh->draw(36); // Draws correctly
// Update model matrix for second object sun.update(); sun.position = glm::vec3(1.5f, 0.0f, 0.0f); // Moved to the side sun.dirty = true; UseProgram(sun); sun.material->shader->set_mat4(sun.modelMatrix, "model"); // shader->set_mat4(cam1.getviwe(), "view"); sun.mesh->draw(36); // Does NOT draw } [/code] [b]Структура моего объекта и сетки (упрощенная):[/b] [code]struct Object { glm::vec3 position; glm::mat4 modelMatrix; Mesh* mesh; Material* material; // Contains shader and texture bool dirty = true;
void draw(GLuint count) { glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, 0); glBindVertexArray(0); } }; [/code] [b]Что я пробовал:[/b] [list] [*]Гарантировать, что sun.update() вызывается для обновления его modelMatrix.
[*]Явно устанавливать модель, униформу для солнца прямо перед рисованием.
[*]Проверка этого sun.mesh->VAO — это ненулевое значение, отличное от mm.mesh->VAO.
[/list] [b]Подозрение:[/b]
Я подозреваю, что проблема может быть в моих макросах-оболочках или в том, что униформы второго шейдера установлены неправильно из-за конфликта состояний OpenGL. Макрос UseProgram расширяется до glUseProgram(object.material->shader->Get_Porogram()). Может ли кто-нибудь помочь мне определить, почему состояние отрисовки первого объекта может мешать второму?