我编写了一个 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)如果我只需要它在其他线程中的值,我是否应该将变量锁定在一个线程中,如果我不这样做,为什么它会起作用?,仅在我的情况下,仅更改一个矩阵就更加简单。