簡體   English   中英

現代Opengl:同時進行正射投影和透視投影

[英]Modern Opengl: Simultaneous orthographic and perspective projection

我正在嘗試使用現代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);

我該怎么做才能使具有正投影的立方體位於具有透視投影的立方體后面?

我不是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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM