将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将是直接的选择。然后,与其使用永远不会返回的不透明glutMainLoop
,不如在你旁边调用glfwPollEvents
是你的 stdio 处理。
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()
好的,所以这是一些非常幼稚的代码,但它应该知道如何更改您的状态以响应用户输入,这反过来又会影响您正在渲染的内容。
如前面的回答所述,如果您希望显式控制程序循环(而不是基于事件的范例),您可以在 GLFW 和 SDL 中有一些不错的选择,但当然会有一些提升,因为 GLUT 以完全不同的方式做事。
找到了一个解决方案,所以自己回答供大家参考:
我迫切需要一种解决方法,而不必将我现有的过剩基本代码更改为 GLFW 和 SDF 等。
在互联网上挖掘更多内容,我发现freeglut支持一个函数glutMainLoopEvent(),该函数"导致freeglut在其事件循环中处理一次迭代的事件。这允许应用程序控制自己的事件循环,并且仍然使用freeglut窗口系统。
此外,freeglut 支持glut 的所有函数(或者至少支持我的程序中使用的所有 glut 函数)。所以,我不必更改我的过剩基本代码。
解决方法的伪代码如下所示。我欢迎你的评论。
#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();
}
我也认为多线程,也可以解决这个问题。一个线程用于 glutMainLoop(),另一个用于数据处理!
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗