最初は怠惰に聞こえるかもしれませんが、私は 2 日間研究してきました。
プリミティブを描画する SDL+GLEW アプリがあります。さまざまな視点でいくつかのビューポートを作成したかったのです。4 つのビューポートが表示されますが、パースペクティブを変更できません。
あなたが持っていると仮定します
draw();
swapbuffers();
OpenGL3+ 仕様で、パースペクティブ ビューポート (または理想的には複数のもの) を作成する最も簡単な方法は何ですか?
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);
最も簡単な方法が唯一の方法です。自分で (いくつかのライブラリ、単純な数学などを使用して) 射影行列を計算し、それを頂点シェーダーのユニフォームにアップロードして、そこで変換を行います。
透視行列の場合:
gluPerspective
、その後glGetFLoatv(GL_PROJECTION_MATRIX, ...)
、その後glUniform
またはglUniformMatrix4fv
ビューポートの場合:glViewport
およびglScissor
. または、framebuffer オブジェクトを使用し、テクスチャにレンダリングしてから、テクスチャをレンダリングします。
PS 非推奨の機能を使用したくない場合は、gluPerspective のドキュメントから行列式を取得し、自分で行列を計算してから、glUniformMatrix4fv を使用してください。または、互換性プロファイルで作業します。