【问题标题】:Modern Opengl: Simultaneous orthographic and perspective projection现代 Opengl:同时正交投影和透视投影
【发布时间】:2017-10-31 06:44:31
【问题描述】:

我正在尝试使用现代 opengl (https://preview.ibb.co/hif8t6/Screenshot_2017_10_31_09_59_27.png) 显示两个立方体。第一个立方体通过正交投影(左)显示,第二个立方体通过透视投影(右)显示。这工作正常,但我无法让左立方体在右立方体后面。 这是相关的sn-p代码

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

我该怎么做才能让正交投影的立方体从透视投影的立方体后面?

【问题讨论】:

  • 在透视投影立方体的“后面”得到正交投影的立方体意味着正交投影计算的dapth值大于透视投影计算的深度值。虽然对于正交投影,深度是线性的,但对于透视投影,它不是线性的。 - 见How to render depth linearly in modern OpenGL with gl_FragCoord.z in fragment shader?
  • 是的,我确实启用了深度测试。你是对的,正字法中的“后面”是线性的,而透视则不是。谢谢你的工作!

标签: c++ opengl perspectivecamera orthographic


【解决方案1】:

我不是 OpenGL 程序员,但这是我的想法。

您正在使用glDrawArrays 线绘制对象两次。对于投影矩阵,他们使用您的 orthographicperspective 矩阵。

但是,这些矩阵是使用不同的参数创建的:

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

【讨论】:

  • 你得到什么结果?
猜你喜欢
  • 2013-11-26
  • 2016-02-11
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多