Рендерится только один из двух одинаковых кубов, несмотря на отдельные VAO, шейдеры и текстуры.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Рендерится только один из двух одинаковых кубов, несмотря на отдельные VAO, шейдеры и текстуры.

Сообщение Anonymous »

Я начинаю с OpenGL и столкнулся с классической проблемой «второй объект не отображается». У меня есть два экземпляра Object ( и sun) с, казалось бы, отдельными VAO, VBO, шейдерными программами и текстурами. Однако только первый объект () появится на экране. Второй () невидим.
Что я проверил/проверил:
  • Оба объекта имеют уникальные экземпляры ShaderProgram и loadTextures.

    Код: Выделить всё

    glGetError()
    не возвращает ошибок после вызовов настройки и отрисовки.
  • Глубинное тестирование включено (

    Код: Выделить всё

    glEnable(GL_DEPTH_TEST)
    ).
  • Обе сетки используют одни и те же данные вершин/индексов, но должны иметь отдельные VAO (см. макрос createVAO).
Камера движется правильно и может видеть область, где должен находиться второй куб.
Основная проблема, похоже, заключается в цикле рендеринга. Если я поменяю местами отрисовку упорядочите и отобразите солнце перед мм, затем солнце станет видимым, а мм исчезнет. Это говорит о том, что проблема не в самих данных, а в том, как состояние OpenGL управляется во время рендеринга.
Минимальный воспроизводимый пример (упрощенный из моего кода):
Вот код, который создан для возражения:

Код: Выделить всё

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");

sun.material->shader->createshader();
UseProgram(sun);
sun.material->shader->set_mat4(cam1.getviwe(), "view");
sun.material->shader->set_mat4(projection, "projection");
createVAO(sun);
createVBO(sun, posiitions, 192);
createEBO(sun, indexe, 36);
setAttrib(sun, 0, 3, 8, 0);
setAttrib(sun, 1, 3, 8, 3);
setAttrib(sun, 2, 2, 8, 6);
load_image(sun);
use_image(sun, GL_TEXTURE1);
sun.material->shader->set_int(1, "texture1");
sun.position = glm::vec3(7.0f);
sun.dirty = true;
sun.material->shader->set_mat4(sun.modelMatrix, "model");

Код: Выделить всё

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
}
Структура моего объекта и сетки (упрощенная):

Код: Выделить всё

struct Object {
glm::vec3 position;
glm::mat4 modelMatrix;
Mesh* mesh;
Material* material; // Contains shader and texture
bool dirty = true;

void update() {
if(dirty) {
modelMatrix = glm::translate(glm::mat4(1.0f), position);
dirty = false;
}
}
};

class Mesh {
public:
GLuint VAO, VBO, EBO;

void createVAO() { glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); }
void createVBO(...) { /* ... glGenBuffers, glBindBuffer, glBufferData ... */ }
void createEBO(...) { /* ...  */ }

void draw(GLuint count) {
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
};
Что я пробовал:
  • Гарантировать, что sun.update() вызывается для обновления его modelMatrix.
  • Явно устанавливать модель, униформу для солнца прямо перед рисованием.
  • Проверка этого sun.mesh->VAO — это ненулевое значение, отличное от mm.mesh->VAO.
Подозрение:

Я подозреваю, что проблема может быть в моих макросах-оболочках или в том, что униформы второго шейдера установлены неправильно из-за конфликта состояний OpenGL. Макрос UseProgram расширяется до glUseProgram(object.material->shader->Get_Porogram()).
Может ли кто-нибудь помочь мне определить, почему состояние отрисовки первого объекта может мешать второму?

Подробнее здесь: https://stackoverflow.com/questions/798 ... s-and-text
Ответить

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

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

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

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

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