2

最初は怠惰に聞こえるかもしれませんが、私は 2 日間研究してきました。

プリミティブを描画する SDL+GLEW アプリがあります。さまざまな視点でいくつかのビューポートを作成したかったのです。4 つのビューポートが表示されますが、パースペクティブを変更できません。

あなたが持っていると仮定します

draw();
swapbuffers();

OpenGL3+ 仕様で、パースペクティブ ビューポート (または理想的には複数のもの) を作成する最も簡単な方法は何ですか?

4

3 に答える 3

4

gluPerspective と同じことを行う GLSL 1.50 コードを次に示します。選択した言語に簡単に変換し、代わりに glUniformMatrix4fv を介してアップロードできます。

mat4 CreatePerspectiveMatrix(in float fov, in float aspect,
    in float near, in float far)
{
    mat4 m = mat4(0.0);

    float angle = (fov / 180.0f) * PI;
    float f = 1.0f / tan( angle * 0.5f );

    /* Note, matrices are accessed like 2D arrays in C.
       They are column major, i.e m[y][x] */

    m[0][0] = f / aspect;
    m[1][1] = f;
    m[2][2] = (far + near) / (near - far);
    m[2][3] = -1.0f;
    m[3][2] = (2.0f * far*near) / (near - far);

    return m;
}

次に、次のようにします。

mat4 worldMatrix = CreateSomeWorldMatrix();
mat4 clipMatrix = CreatePerspectiveMatrix(90.0, 4.0/3.0, 1.0, 128.0);

gl_Position = worldMatrix * clipMatrix * myvertex;
some_varying1 = worldMatrix * myvertex; 
some_varying2 = worldMatrix * vec4(mynormal.xyz, 0.0);
于 2010-08-18T12:21:53.603 に答える
3

最も簡単な方法が唯一の方法です。自分で (いくつかのライブラリ、単純な数学などを使用して) 射影行列を計算し、それを頂点シェーダーのユニフォームにアップロードして、そこで変換を行います。

于 2010-08-17T01:26:31.060 に答える
2

透視行列の場合: gluPerspective、その後glGetFLoatv(GL_PROJECTION_MATRIX, ...)、その後glUniformまたはglUniformMatrix4fv

ビューポートの場合:glViewportおよびglScissor. または、framebuffer オブジェクトを使用し、テクスチャにレンダリングしてから、テクスチャをレンダリングします。

PS 非推奨の機能を使用したくない場合は、gluPerspective のドキュメントから行列式を取得し、自分で行列を計算してから、glUniformMatrix4fv を使用してください。または、互換性プロファイルで作業します。

于 2010-08-17T01:30:13.343 に答える