将 C++ OpenGL 项目与另一个 C++ 项目集成
Integrating C++ OpenGL project with another C++ project
我正在处理一个读取数据文件、执行一些计算并在标准输出上显示结果的项目。后来我想给结果一个 3D 图形视图,所以我做了一个新的 OpenGL 项目,将数据显示为 3D 对象。
现在的问题是,我想不出整合这两个独立项目的方法,因为我的 OpenGL 项目中的 main()
进入了一个非终止 glutMainLoop()
循环,而我无法弄清楚在我的第一个项目的 main()
中将循环放在哪里!
/**** Proj1 ****/
int main()
{
while(ESC key not pressed)
{
// read data file
// do some processing
// show results on standard output
}
}
/**** Proj2 ****/
int main()
{
glutInit(&argc, argv);
Init();
glutDisplayFunc(Display);
glutKeyboardFunc(Keyboard);
glutMouseFunc(Mouse);
glutIdleFunc(Idle);
glutMainLoop();
}
要求 Proj1 和 Proj2 之间的代码混合最少。
是否可以这样做:
/**** Proj1 ****/
#include <filesFromProj2>
int main()
{
while(ESC key not pressed)
{
// read data file
// do some processing
proj2.showResult(result) // how to do this ?
}
}
最简单的解决方案是放弃 GLUT 并使用可让您实现事件循环的 OpenGL 窗口框架。 GLFW 将是直接的选择。然后,您不会有一个永远不会 returns 的不透明 glutMainLoop
,而是在您的 stdio 处理旁边调用 glfwPollEvents
。
GLUT 将事件处理代码与显示代码分离。如果您习惯于完全控制循环的范例,您会感觉很奇怪,但这并不难处理。基本上,您需要维护 glutDisplayFunc 将做出反应的状态,并在 glutKeyboardFunc 中更新该状态。所以在伪代码中(看起来你已经关闭了 C++):
displayFunc:
if state.showProj1
proj1.showResult
else if state.showProj2
proj2.showResult
keyboardFunc
if keyPressed(esc)
state.showProj1 = false
state.showProj2 = true
glutPostRedisplay()
好的,这是一些非常幼稚的代码,但它应该了解如何更改您的状态以响应用户输入,这反过来会影响您正在渲染的内容。
如前一个答案所述,如果您想要显式控制程序循环(与 event-based 范式相反),您在 GLFW 和 SDL 中有一些不错的选择,但当然会有一些 ramp-up 因为 GLUT 以完全不同的方式做事。
找到解决办法自己回答一下,供大家参考:
我迫切需要一种解决方法,而不必将我现有的过剩基本代码更改为 GLFW 和 SDF 等
在互联网上挖掘更多我发现 freeglut 支持一个函数 glutMainLoopEvent() "causes freeglut to process one iteration’s worth of events in its event loop. This allows the application to control its own event loop and still use the freeglut windowing system."
此外,freeglut 支持 glut 的所有功能(或者至少支持我的 prog 中使用的所有 glut 功能)。所以,我不必更改过剩的基本代码。
pseudo-code 解决方法如下。欢迎大家发表意见。
#include <gl/freeglut.h>
#include <filesFromProj2>
int main()
{
glutInit(&argc, argv);
Init();
glutDisplayFunc(Display);
glutKeyboardFunc(Keyboard);
glutMouseFunc(Mouse);
glutIdleFunc(Idle);
// glutMainLoop(); // Do not use this
while(ESC key not pressed)
{
// read data file
// do some processing
proj2.showresults(results)
glutMainLoopEvent(); // One iteration only
Display(); // Call the func used with glutDisplayFunc()
}
glutLeaveMainLoop();
}
我也想到了multi-threading,或许也能解决这个问题。一个线程用于 glutMainLoop(),另一个线程用于数据处理!!
我正在处理一个读取数据文件、执行一些计算并在标准输出上显示结果的项目。后来我想给结果一个 3D 图形视图,所以我做了一个新的 OpenGL 项目,将数据显示为 3D 对象。
现在的问题是,我想不出整合这两个独立项目的方法,因为我的 OpenGL 项目中的 main()
进入了一个非终止 glutMainLoop()
循环,而我无法弄清楚在我的第一个项目的 main()
中将循环放在哪里!
/**** Proj1 ****/
int main()
{
while(ESC key not pressed)
{
// read data file
// do some processing
// show results on standard output
}
}
/**** Proj2 ****/
int main()
{
glutInit(&argc, argv);
Init();
glutDisplayFunc(Display);
glutKeyboardFunc(Keyboard);
glutMouseFunc(Mouse);
glutIdleFunc(Idle);
glutMainLoop();
}
要求 Proj1 和 Proj2 之间的代码混合最少。 是否可以这样做:
/**** Proj1 ****/
#include <filesFromProj2>
int main()
{
while(ESC key not pressed)
{
// read data file
// do some processing
proj2.showResult(result) // how to do this ?
}
}
最简单的解决方案是放弃 GLUT 并使用可让您实现事件循环的 OpenGL 窗口框架。 GLFW 将是直接的选择。然后,您不会有一个永远不会 returns 的不透明 glutMainLoop
,而是在您的 stdio 处理旁边调用 glfwPollEvents
。
GLUT 将事件处理代码与显示代码分离。如果您习惯于完全控制循环的范例,您会感觉很奇怪,但这并不难处理。基本上,您需要维护 glutDisplayFunc 将做出反应的状态,并在 glutKeyboardFunc 中更新该状态。所以在伪代码中(看起来你已经关闭了 C++):
displayFunc:
if state.showProj1
proj1.showResult
else if state.showProj2
proj2.showResult
keyboardFunc
if keyPressed(esc)
state.showProj1 = false
state.showProj2 = true
glutPostRedisplay()
好的,这是一些非常幼稚的代码,但它应该了解如何更改您的状态以响应用户输入,这反过来会影响您正在渲染的内容。
如前一个答案所述,如果您想要显式控制程序循环(与 event-based 范式相反),您在 GLFW 和 SDL 中有一些不错的选择,但当然会有一些 ramp-up 因为 GLUT 以完全不同的方式做事。
找到解决办法自己回答一下,供大家参考:
我迫切需要一种解决方法,而不必将我现有的过剩基本代码更改为 GLFW 和 SDF 等
在互联网上挖掘更多我发现 freeglut 支持一个函数 glutMainLoopEvent() "causes freeglut to process one iteration’s worth of events in its event loop. This allows the application to control its own event loop and still use the freeglut windowing system."
此外,freeglut 支持 glut 的所有功能(或者至少支持我的 prog 中使用的所有 glut 功能)。所以,我不必更改过剩的基本代码。
pseudo-code 解决方法如下。欢迎大家发表意见。
#include <gl/freeglut.h>
#include <filesFromProj2>
int main()
{
glutInit(&argc, argv);
Init();
glutDisplayFunc(Display);
glutKeyboardFunc(Keyboard);
glutMouseFunc(Mouse);
glutIdleFunc(Idle);
// glutMainLoop(); // Do not use this
while(ESC key not pressed)
{
// read data file
// do some processing
proj2.showresults(results)
glutMainLoopEvent(); // One iteration only
Display(); // Call the func used with glutDisplayFunc()
}
glutLeaveMainLoop();
}
我也想到了multi-threading,或许也能解决这个问题。一个线程用于 glutMainLoop(),另一个线程用于数据处理!!