さまざまな投影(オタ、パースペクティブ、フュースターラム)を使用して、ディテールビューポートでいくつかのシーンをレンダリングする必要があります。私は透視投影を参照resuultとして複数のビューポートでのパースペクティブとオルトの使い方(OpenGL 4.x)
//1
glViewport(0, 0, 500, 500);
ortho = glm::ortho(left, right, top, bottom, -1.f, 1.f); //-1.f, 1.f, -1.f, 1.f, -1.f, 1.f
GLint orthoLoc = glGetUniformLocation(programID, "ortho");
glUniformMatrix4fv(orthoLoc, 1, GL_FALSE, &ortho[0][0]);
Projection::lookAtScene(programID, glm::vec3(0, 1, 0), glm::vec3(0, 0, 0), glm::vec3(1, 0, 0));
drawCube();
//2
glViewport(500, 0, 500, 500);
glm::mat4 fru = glm::frustum(left, right, top, bottom, 1.f, 20.f);
GLint fruLoc = glGetUniformLocation(programID, "fru");
glUniformMatrix4fv(fruLoc, 1, GL_FALSE, &fru[0][0]);
Projection::lookAtScene(programID, glm::vec3(0, 0, 0), glm::vec3(0, 0, -1), glm::vec3(0, 1, 0));
drawCube();
頂点シェーダで
uniform mat4 ortho;
uniform mat4 proj;
uniform mat4 view;
uniform mat4 fru;
...
mat4 Model = rotate*scale*trans;
Model = Model*ortho*view*fru;
gl_Position = Model*vec4(pos.xyz, 1);
。私はそれがそれをする最善の方法ではないことを知っています。どのようにしてそれを正しく行うことができ、各ビューポートに独自の投影ができましたか。
"*私はそれを行う最良の方法ではないことを知っています*"それは意味する*方法ではありません。カメラマトリックスの片側に正射投影を、もう片方に透視投影を掛けています。なぜあなたは*両方の*行列を使っていますか?そしてなぜあなたはそれらの間にカメラを置いていますか?なぜモデルからカメラへの変換を行列の左辺*に置いているのですか? –
ビューポート1にはオルト、ビューポート2にはパースペクティブが必要です(カメラは重要ではありません - 私は試しました)。私はどこから始めるべきかを知りたいです... –
あなたの目標を完全に誤解していない限り、あなたはこれを過度に複雑にしています。必要なのは、シェーダコード内の**単一の**投影変換だけです。次に、この投影行列を、ビューに使用する投影法に応じて、 'glUniformMatrix4fv()'呼び出しを使って透視投影または逆投影行列に設定します。 –