OpenGLでは、OpenGL3+メソッドのみを使用してパースペクティブビューを作成する最も簡単な方法は何ですか?
質問
これは最初は怠zyに聞こえるかもしれませんが、私は2日間研究してきました。
プリミティブを描くSDL+Glewアプリがあります。さまざまな視点でいくつかのビューポートを作りたかったのです。 4つのビューポートが表示されますが、視点を変更することはできません。
あなたが持っていると仮定します
draw();
swapbuffers();
Perspective ViewPort(または理想的には複数のもの)を作成するための最も簡単な方法 - OpenGl3+ Spec-では何がありますか?
解決
最も簡単なのは唯一の方法です。投影マトリックスで自分自身(いくつかのLIB、プレーン数学など)を計算し、頂点シェーダーのユニフォームにアップロードし、そこで変換を行います。
他のヒント
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
. 。または、フレームバッファオブジェクトを使用してテクスチャにレンダリングし、テクスチャをレンダリングします。
PS控除された機能を使用したくない場合は、 Gluperspection ドキュメント、自分でマトリックスを計算してから、gluniformmatrix4fvを使用します。または互換性プロファイルで作業します。