2016-06-17 24 views
0

さまざまな投影(オタ、パースペクティブ、フュースターラム)を使用して、ディテールビューポートでいくつかのシーンをレンダリングする必要があります。私は透視投影を参照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); 

。私はそれがそれをする最善の方法ではないことを知っています。どのようにしてそれを正しく行うことができ、各ビューポートに独自の投影ができましたか。

+0

"*私はそれを行う最良の方法ではないことを知っています*"それは意味する*方法ではありません。カメラマトリックスの片側に正射投影を、もう片方に透視投影を掛けています。なぜあなたは*両方の*行列を使っていますか?そしてなぜあなたはそれらの間にカメラを置いていますか?なぜモデルからカメラへの変換を行列の左辺*に置いているのですか? –

+0

ビューポート1にはオルト、ビューポート2にはパースペクティブが必要です(カメラは重要ではありません - 私は試しました)。私はどこから始めるべきかを知りたいです... –

+0

あなたの目標を完全に誤解していない限り、あなたはこれを過度に複雑にしています。必要なのは、シェーダコード内の**単一の**投影変換だけです。次に、この投影行列を、ビューに使用する投影法に応じて、 'glUniformMatrix4fv()'呼び出しを使って透視投影または逆投影行列に設定します。 –

答えて

0

ビューポートにオフセットを付ける必要があります。そうしないと、互いの上に描画されます。また、 "はさみ試験"を調べる必要があります。

+0

いいえ、そのx、yは正しいです。 4つのビューポートはすべて隣に表示されます...オブジェクトもうまく描画されますが、両方のビューポートは同じ投影を持ちます。違わない。 –

0

のErr、それはのようになりますのは、シェーダ..に

を見てみましょう:

gl_Position = completeProjection * vec4(position, 1.0f); 

しかし、私はあなたが1つのシェーダで視点と正投影を使用したい見ていますか? (私がここで間違っているなら私を訂正してください)。あなたがそのようにしたい場合は、おそらくそれが好きですかすることができます:あなたのコードで

gl_Position = perspectiveProjection * orthoProjection * view * model * vec4(position, 1.0f); 

が好き、それは次のようになります。

uniform mat4 ortho; 
uniform mat4 proj; 
uniform mat4 view; 
uniform mat4 fru; 

void main() { 
    mat4 Model = rotate * scale * trans; // Same 
    Model = ortho * fru * view * Model; // the order of ortho and fru here doesn't matter (See explanation below) /!\The order for the other is importent though/!\ 
    gl_Position = Model * vec4(pos.xyz, 1); // By this point, Model is a complete projection 
} 

カメラ切り替えアイデンティティに未使用のマトリックスを置くことを忘れないでくださいマトリックス。アイデンティティ・マトリックスは何もしないので、orthofruの順番は重要ではありません。その1つがアイデンティティであるからです。 しかし、projectionという名前のユニフォームを使用することをお勧めします。別のビューからレンダリングするたびにオルソ/パースペクティブマトリックスをアップロードしてください。そうすれば、未使用の行列をIDに設定する必要はありません。同様に:

// ---Code--- 

// Preparing ortho matrix & other matrices 
glUniformMatrix4fv(glGetUniformLocation(programID, "proj"), 1, GL_FALSE, &ortho[0][0]); 
drawCube(); 
// Preparing perspective matrix & other matrices 
glUniformMatrix4fv(glGetUniformLocation(programID, "proj"), 1, GL_FALSE, &fru[0][0]); 
drawCube(); 

// ---Vertex Shader--- 

uniform mat4 proj; 
uniform mat4 view; 

void main() { 
    mat4 Model = rotate * scale * trans; // Same 
    Model = proj * view * Model; // the order of ortho and fru here doesn't matter (See explanation below) 
    gl_Position = Model * vec4(pos.xyz, 1); // By this point, Model is a complete projection 
} 

P.s:と私は言った


が、私は情報不足にはもう言うことはできません..あなたはすでにそこ proj行列の制服を持っている参照してください。しかし、これは私が間違って見るものです。

関連する問題