2017-10-31 15 views
0

現代のOpenGL(https://preview.ibb.co/hif8t6/Screenshot_2017_10_31_09_59_27.png)を使って2つの立方体を表示しようとしています。最初の立方体は、正投影(左)と2番目の立方体(透視投影)で表示されます(右)。それは正常に動作しているが、私は右のキューブの後ろに行くために左のキューブを取得することができません。ここ は、私は透視投影でキューブの後ろに行くには、正投影とキューブを取得するために何をしますかコード現代OpenGL:同時正投影と透視投影

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

のrelavantスニペットのですか?

+2

正射影によって算出dapth値は、透視投影によってcalcualted奥行き値よりもおろし金であることを透視投影手段と立方体、「後ろ」正射影とキューブを取得します。正射投影の場合、深さは線形ですが、透視投影の場合は線形ではありません。 - フラグメントシェーダでgl_FragCoord.zを使用して最新のOpenGLで線形に深度をレンダリングする方法(https://stackoverflow.com/questions/7777913/how-to-render-depth-linearly-in-modern-opengl-with)を参照してください。 -gl-fragcoord-z-in-fragment-sh/45710371#45710371) – Rabbid76

+0

['glEnable(GL_DEPTH_TEST)'](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glEnable .xhtml)? – Rabbid76

+0

はい、深度テストを有効にしました。そして正解です。正射投影では「後ろ」は線形であり、視点ではそうではありません。ありがとうございました! – ram

答えて

-2

私はOpenGLプログラマーではありませんが、これは私の考えです。

glDrawArrays行を使用してオブジェクトを2回描画しています。投影行列の場合は、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)); 
+0

ありがとうエリック、私はそれを試みたが、悲しいことに、それは動作しませんでした – ram

+0

あなたはどのような結果を得ますか? – Eric

関連する問題