ベクトルやバッファオブジェクトなどについて多くを読み、古い/新しいopengl操作を実装するサンプルアプリケーションの多くを確認しました。オブジェクトの読み込み、変換、頂点/フラグメントシェーダーを含む私のアプリは、一般に、さまざまなタイプの変数をシェーダーに渡す方法、および配列と要素配列を描画する方法を理解しています。これまでのところ、すべてうまくいきます。
しかし、私が理解していないことが1つあります。最終的なgl_Position行列は、いくつかの数学演算の結果として、生成され、頂点シェーダーに渡された行列を使用しました(実際には、SDL、glew、およびlookAt、translate、rotateなどのglmの関数を使用します)。
私がしているのはシェーダーです
#version ...
uniform mvp..
main ..
{
gl_Position = mvp * ...;
}
cpp
load_object_vertices_indexes_etc;
install_shaders;
bind_buffers;
buffer_data;
enable_vertex_array_elements_etc;
mat4 aaa_proj = perspective(persp_params);
mat4 bbb_view = lookAt(look_params);
mat4 ccc_model = translate(translate_params);
mat4 ddd_anim = rotate(rotate_params);
/* then I do matrix multiply */
mat4 some_final = ..proj * ...view * ..model * anim;
glUniformMatrix4fv(location_in_shader, 1, GL_FALSE, ..val_pointer_of_some_final)
glClear(appropriate_bitfield);
glDraw...(spec);
重要なのは、実際には、もちろん、任意の組み合わせで生成できる最終的な行列です。シェーダーは、生成方法に関係なく、有効な結果マトリックスを使用してgl_Positionを呼び出します。さて、正確にどこで投影からビュー、モデル、アニメーションに切り替えるのですか?もちろん、マトリックス名は重要ではありません。パースペクティブ、lookAt、変換、回転の内側のどこかに切り替えがありますか?つまり、スタックに実際に4つのステージが含まれている場合、これらの各ステージは、変換、回転、スケーリングなどが可能です。これまでに理解しているように、マトリックススタックのステージが1つしかない場合は、実行するアクションは重要ではありません。 。
理論的には、3Dシーン内では、I(ビューを左に45度回転してから、モデルを右に45度回転)、またはI(ビュー45を右に回転してから、モデル45を左に回転)の場合に、同様の効果を得ることができます。
ティーポットの前に物理的に立っているときは、右に45回転してテーブルを歩き回り(平行移動して回転)、左に45に回して正面から見るか、左に45に回して45から右に歩いてから見ることができます。フロント。それは世界の他の地域では異なりますが(ティーポットの後ろに左または右の部屋の壁が見えます)、明らかにポットの正面は見えなくなります。
したがって、結論として、2つのルーチン(A(obj_turn_left、me_turn_right)とB(obj_turn_right、me_turn_left)、両方とも最初に回転モデル、後で自分自身(目、カメラ))を実装する場合、どのマトリックスモードに指定するのですか?特定の回転または変換が適用されますか?glMatrixMode(APPROPRIATE_CONST)を使用して、必要なときに特定のステージに強制的に移動する必要がありますか?これまでのところ、glMatrixModeは私のコードでは使用されていません。