@makaleks

А Вы смешивали Boost.Thread и OpenGL?

Хотел показать процесс выполнения одной ёмкой функции (ну, который рисовал бы "осталось ... из ...") отдельным потоком, но обнаружил, что я не могу заставить OpenGL рисовать в отдельном потоке Boots
При этом
код
void f(){
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_LINES);
	glVertex2i(-200,-200);
	glVertex2i(200,200);
	glEnd();
	glfwSwapBuffers(app.window);//меняет буфферы - функция GLFW
}

int main(){
	glfwInit();
	GLFWwindow* window=prepare(400,400);//prepare - пользовательский; создаёт окно, подключает callback... не в нём дело, и обнаружил в другом месте (могу потом выложить)
	f();
	return 0;
}
работает, а в
похожем коде
void f(){
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_LINES);
	glVertex2i(-200,-200);
	glVertex2i(200,200);
	glEnd();
	glfwSwapBuffers(app.window);//меняет буфферы - функция GLFW
}

int main(){
	glfwInit();
	GLFWwindow* window=prepare(400,400);//prepare - пользовательский; создаёт окно, подключает callback... не в нём дело - тестировал Очень далеко от него
	
	boost::thread th(f);
	th.join();
	return 0;
}
свою задачу, похоже, выполняет только glfwSwapBuffers() (отрывок взял для примера; да, так он тоже не работает)

Вам приходилось успешно совмещать Boost.Thread с OpenGL ?
В чём может быть косяк?

Спасибо
  • Вопрос задан
  • 2620 просмотров
Решения вопроса 1
icelaba
@icelaba
Знаю и умею всё
В общем случае используют подход не рисовать из разных потоков, а рисовать в одном потоке а в других делать расчет отрисовки т.е команды opengl вызываются только из одного потока.
(грубо там где инициализировали там и рисуйте во избежание)

Собственно контекст opengl привязан к потоку см. описание glXMakeCurrent, wglMakeCurrent его типа можно использовать в другом потоке но надо предварительно освободить в текущем.

Но если уж вы совсем заморочились то все таки можно рисовать и из разных потоков используя overlays - подробности тут www.opengl.org/archives/resources/faq/technical/co...
но как мне кажется вы все таки не хотите рисовать из разных потоков а просто хотите делать расчетку в другом, тогда просто внимательно проследите чтобы MakeCurrent команда и все последующие команды отрисовки работали в одном потоке.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы