Modern Opengl: одновременная орфографическая и перспективная проекция

Я пытаюсь отобразить два куба, используя современный OpenGL (https://preview.ibb.co/hif8t6/Screenshot_2017_10_31_09_59_27.png). Первый куб отображается ортогональной проекцией (слева), а второй — перспективной проекцией (справа). Это работает нормально, но я не могу заставить левый куб идти позади правого куба.
Вот соответствующий фрагмент кода

    ourShader_ortho.Use();
ourShader_persp.Use();

glm::mat4 model_ortho, model1, model2, model;
glm::mat4 view_ortho, view_persp;
glm::mat4 orthographic;
glm::mat4 perspective;

model1 = glm::rotate(model, (GLfloat)glfwGetTime()*1.0f, glm::vec3(0.5f, 1.0f, 0.0f));
model2 = glm::rotate(model, (GLfloat)glfwGetTime()*1.0f, glm::vec3(0.0f, 1.0f, 0.5f));
model = model1 * model2;

view_ortho = glm::translate(view_ortho, glm::vec3(200.0f, 200.0f, -150.0f));
orthographic = glm::ortho(0.0f, (GLfloat)width, 0.0f, (GLfloat)height, 0.1f, 200.0f);

view_persp = glm::translate(view_persp, glm::vec3(1.0f, 0.0f, -3.0f));
perspective = glm::perspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 200.0f);

GLint modelLoc_ortho = glGetUniformLocation(ourShader_ortho.Program, "model");
GLint viewLoc_ortho = glGetUniformLocation(ourShader_ortho.Program, "view");
GLint projLoc_ortho = glGetUniformLocation(ourShader_ortho.Program, "orthographic");

glUniformMatrix4fv(modelLoc_ortho, 1, GL_FALSE, glm::value_ptr(model_ortho));
glUniformMatrix4fv(viewLoc_ortho, 1, GL_FALSE, glm::value_ptr(view_ortho));
glUniformMatrix4fv(projLoc_ortho, 1, GL_FALSE, glm::value_ptr(orthographic));

glBindVertexArray(VAO_O);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);

GLint modelLoc_persp = glGetUniformLocation(ourShader_persp.Program, "model");
GLint viewLoc_persp = glGetUniformLocation(ourShader_persp.Program, "view");
GLint projLoc_persp = glGetUniformLocation(ourShader_persp.Program, "perspective");

glUniformMatrix4fv(modelLoc_persp, 1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(viewLoc_persp, 1, GL_FALSE, glm::value_ptr(view_persp));
glUniformMatrix4fv(projLoc_persp, 1, GL_FALSE, glm::value_ptr(perspective));

glBindVertexArray(VAO_P);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArray(0);

Что мне сделать, чтобы куб с ортогональной проекцией прошел позади куба с перспективной проекцией?

0

Решение

Я не программист OpenGL, но это то, что я думаю.

Вы рисуете объект дважды, используя glDrawArrays линий. Для матриц проекции они используют ваши orthographic а также perspective матрицы.

Однако эти матрицы создаются с использованием разных параметров:

view_ortho = glm::translate(view_ortho, glm::vec3(200.0f, 200.0f, -150.0f));
view_persp = glm::translate(view_persp, glm::vec3(1.0f, 0.0f, -3.0f));

Я предполагаю, что вы хотите унифицировать параметры перевода так, чтобы кубы лежали точно друг над другом.

Например.

view_ortho = glm::translate(view_ortho, glm::vec3(200.0f, 200.0f, -150.0f));
view_persp = glm::translate(view_persp, glm::vec3(200.0f, 200.0f, -150.0f));
-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]