次の方法で実行される OpenGL プログラムを作成しました。
Main:
- Initialize SDL
- Create thread which has the OpenGL context:
- Renderloop
- Set camera (view) matrix with glUniform.
- glDrawElements() .... etc.
- Swapbuffers();
- Main SDL loop handling input events and such.
- Update camera matrix of type glm::mat4.
これは、opengl を処理するクラスにカメラ オブジェクトを渡す方法です。
Camera *cam = new Camera();
gl.setCam(cam);
どこ
void setCam(Camera *camera) {
this->camera = camera;
}
opengl コンテキスト スレッドでのレンダリングでは、次のようになります。
glm::mat4 modelView = camera->view * model;
glUniformMatrix4fv(shader->bindUniform("modelView"), 1, GL_FALSE, glm::value_ptr(modelView));
SDL などを処理するメイン プログラムで、ビュー マトリックスを再計算します。これは、ミューテックスロックを使用しなくても正常に機能します。これは正しいです?
一方、「アップロード キュー」によってシーンにオブジェクトを追加します。この場合、アイテムを追加するときにアップロード キュー ベクター (ベクター クラス タイプ) をミューテックス ロックする必要があります。そうしないと、プログラムがクラッシュします。
要約すると、別のスレッドで行列を再計算し、ミューテックス ロックなしで opengl スレッドで使用します。なぜこれが機能するのですか?
編集: 私の質問はここで尋ねられたものと似ていると思います:
1)あるスレッドで変数をロックする必要があるのは、その変数の値が他のスレッドで必要な場合のみです。、私の場合のみ、変更されるマトリックスが1つだけでさらに単純です。