OpenSceneGraph编译

初学OSG,第一件事情就是编译,经过几天的折腾,那只五光十色的奶牛终于见面了。一向比较头疼编译这件事情,编译成功前觉得遥不可及,编译成功后觉得易如反掌。既然编过了,做个笔记,备忘。

1. 准备源码和工具

1. OpenSceneGraph-3.6.2
   http://www.openscenegraph.org/index.php/download-section/stable-releases/

2. 3rdParty_VS2017_v141_x64_V11_small.7z
   http://www.openscenegraph.org/index.php/download-section/dependencies/

3. OpenSceneGraph-Data-3.4.0.zip
   http://www.openscenegraph.org/index.php/download-section/data/

2. Visiual Studio 2017 x64
   https://visualstudio.microsoft.com/zh-hans/downloads/

3. cmake-3.12.1-win64-x64.msi
   https://cmake.org/download/

4. qt-opensource-windows-x86-5.9.6.exe
   http://download.qt.io/archive/qt/5.9/5.9.6/

5. qt-vsaddin-msvc2017-2.2.1.vsix
   http://download.qt.io/archive/vsaddin/

2. 通过Cmake生成VS工程

三个文件夹:一个源码,一个三方库,一个模型数据,如下所示:

在源码目录中创建要给build目录,用于构建,如下:

修改CMakeLists.txt,添加两行,如下:

#
# OpenSceneGraph CMake build file
#
SET(OPENSCENEGRAPH_MAJOR_VERSION 3)
SET(OPENSCENEGRAPH_MINOR_VERSION 6)
SET(OPENSCENEGRAPH_PATCH_VERSION 2)
SET(OPENSCENEGRAPH_SOVERSION 157)

# add 2 lines below:
SET(DESIRED_QT_VERSION "5.9.6" CACHE STRING "")
SET(CMAKE_PREFIX_PATH "C:/Qt/Qt5.9.6/5.9.6/msvc2017_64" CACHE PATH "") 

启动CMake,配置源码目录和构建目录,并正确设置配置项,如下:

点击”Configure“,成功后点击”Generate“,成功后点击”Open Project“,启动Visiual Studio 2017,准备开始编译。

3. 编译

启动工程后选择“批生成”,如下:

打两个钩,点击“生成”,睡一觉醒来就完成了,250个成功,0个失败。

如果失败了,那也没办法。

4. 将OSG添加到系统环境变量

OSG_INCLUDE_DIR:
E:\OSG\source\OpenSceneGraph-3.6.2\OpenSceneGraph\include
E:\OSG\source\OpenSceneGraph-3.6.2\OpenSceneGraph\build\include

PATH:
E:\OSG\source\OpenSceneGraph-3.6.2\OpenSceneGraph\build\bin
E:\OSG\source\OpenSceneGraph-3.6.2\3rdparty\bin
E:\OSG\source\OpenSceneGraph-3.6.2\OpenSceneGraph\build\lib

OSG_FILE_PATH:
E:\OSG\source\OpenSceneGraph-3.6.2\OpenSceneGraph-Data

5. 运行example

6. 编写HelloWorld

#include <Windows.h>

#include<osgViewer/Viewer>
#include<osgDB/ReadFile>
int main()
{
	osgViewer::Viewer viewer;
	viewer.setSceneData(osgDB::readNodeFile("cow.osg"));

	return viewer.run();
}

注意下面说明,否则欲哭无泪:

最最重要的一行代码是:

#include <Windows.h>

否则将会抛出一大堆的未定义错误:

Ctrl + F5运行,奶牛出来,你就成功了:

睡觉了,晚安!

<think>好的,我现在要解决用户的问题,如何在Unreal Engine中编译OpenSceneGraph。首先,我需要了解用户的需求。用户可能是一名游戏开发者,正在尝试将OpenSceneGraph集成到Unreal Engine项目中,但遇到了编译方面的困难。 首先,我应该回忆一下OpenSceneGraph(OSG)和Unreal Engine(UE)的基本情况。OSG是一个开源的图形工具包,常用于可视化应用,而UE是主流的游戏引擎,两者集成可能需要处理编译和链接。但UE本身使用自己的渲染管线和模块系统,直接将OSG编译进去可能存在兼容性问题。 接下来,我需要考虑可能的解决方案。根据经验,将第三方集成到UE通常需要将编译静态或动态链接,并在UE的项目文件中正确配置包含路径和路径。但OSG可能依赖其他,如OpenGL,而UE默认使用的是自己的渲染器,可能涉及不同的图形API,比如DirectX或Vulkan,这可能导致冲突。 然后,我需要查阅相关资料。用户提供的引用中提到了集成Dear ImGui的方法,需要连接输入设备、处理纹理和渲染功能。虽然这不直接相关,但思路类似,可能需要将OSG作为外部链接到UE中。另外,用户引用的音频如FMOD、OpenAL可能也有类似的集成步骤,但OSG作为图形更复杂。 接下来,我应该分步骤思考: 1. 编译OpenSceneGraph为UE可用的:首先需要将OSG编译成适合UE的版本。UE主要支持Windows、Mac、Linux等平台,需要确保OSG在这些平台上正确编译,并生成静态(如.lib或.a文件)或动态.dll或.so)。需要注意UE的编译工具链,比如在Windows上使用Visual Studio,版本需匹配。 2. 配置UE项目文件:在UE的ProjectName.Build.cs中添加OSG的头文件路径和路径,链接文件。可能需要处理依赖项,如第三方zlib、libpng等,这些也需要编译并链接。 3. 处理平台差异:UE在不同平台上的构建方式不同,可能需要为每个目标平台编译OSG,并处理平台特定的配置。 4. 处理渲染兼容性:OSG基于OpenGL,而UE默认可能使用DirectX或Vulkan。需要确保两者在渲染时不会冲突,或者修改OSG的渲染后端以适应UE的渲染管线。这可能比较复杂,甚至需要修改OSG源码。 5. 测试与调试:集成后编写测试代码,调用OSG的功能,检查是否正常运行,并解决可能出现的链接错误或运行时错误。 可能的挑战包括: - 依赖管理:OSG可能有多个依赖项,需要全部正确编译并链接到UE项目中。 - 图形API冲突:UE和OSG使用不同的图形API,可能导致上下文冲突或性能问题。 - 内存管理:UE有自己的内存管理机制,而OSG可能使用不同的方式,需要注意对象生命周期和内存泄漏。 然后,我需要验证这些步骤是否有实际案例或教程支持。由于用户提到找不到相关教程,可能需要参考类似的集成经验,或者建议用户查阅OSG和UE的官方文档、社区论坛。例如,OSG的文档可能提供编译指南,而UE的文档可能解释如何集成第三方。 此外,可能需要使用UE的插件系统,将OSG封装为引擎插件,这样可以在不同项目中复用。或者,使用UE的C++代码,通过自定义模块来调用OSG的功能。 最后,总结步骤,并提示用户可能遇到的问题和解决方案,如处理依赖、图形API冲突等。同时,建议用户参考OSG的官方编译指南和UE的第三方集成文档,或者寻求社区支持。</think>在 Unreal Engine (UE) 中集成 OpenSceneGraph (OSG) 需要解决编译、依赖管理和渲染兼容性问题。以下是具体步骤和注意事项: --- ### **1. 编译 OpenSceneGraph 为 UE 兼容** - **获取源码**:从 [OpenSceneGraph 官网](https://www.openscenegraph.com/) 下载源码或通过 Git 克隆仓- **配置编译工具**: - **Windows**:使用 CMake 生成 Visual Studio 项目文件,确保与 UE 使用的 Visual Studio 版本一致(如 VS 2022)。 - **Linux/macOS**:通过 CMake 生成 Makefile 或 Xcode 项目。 - **依赖项管理**: - OSG 依赖第三方(如 `libjpeg`, `libpng`, `zlib`),需提前编译或通过包管理器安装[^1]。 - **生成静态/动态**: ```bash cmake -D BUILD_SHARED_LIBS=OFF -D CMAKE_INSTALL_PREFIX=./install .. make install ``` 生成静态(`.lib`/`.a`)可减少 UE 项目中的动态链接问题。 --- ### **2. 配置 UE 项目** - **添加头文件与路径**: 在 `YourProject.Build.cs` 中添加 OSG 头文件路径和编译后的文件路径: ```csharp PublicIncludePaths.Add("Path/To/OSG/include"); PublicAdditionalLibraries.Add("Path/To/OSG/lib/osg.lib"); // 添加其他依赖(如 osgViewer.lib、osgDB.lib 等) ``` - **处理平台差异**: - 使用 `RuntimeDependencies.Add()` 确保动态(如 `.dll`)被复制到输出目录。 - 在 `UE_EDITOR` 宏下区分开发环境与打包环境。 --- ### **3. 处理渲染兼容性** - **图形 API 冲突**: - UE 默认使用 DirectX/Vulkan,而 OSG 基于 OpenGL。需在 UE 项目中启用 OpenGL 支持: - 修改 `DefaultEngine.ini`: ```ini [RHI] PreferredRHI=OpenGL ``` - **注意**:此配置可能导致 UE 渲染管线性能下降,需谨慎权衡[^1]。 - **上下文隔离**: - 创建独立的 OpenGL 上下文供 OSG 使用,避免与 UE 的渲染线程冲突。 --- ### **4. 示例代码与测试** - **封装 OSG 功能**: ```cpp #include <osgViewer/Viewer> class OSGWrapper { public: void Initialize() { _viewer = new osgViewer::Viewer(); // 加载模型、设置场景等 } private: osg::ref_ptr<osgViewer::Viewer> _viewer; }; ``` - **在 UE Actor 中调用**: ```cpp AMyActor::AMyActor() { OSGWrapper::Initialize(); } ``` --- ### **常见问题与解决方案** 1. **链接错误**: - 确保所有 OSG 依赖(如 `OpenThreads`)已正确链接。 - 检查文件的平台(Win64/Linux)是否与 UE 目标平台一致。 2. **运行时崩溃**: - 确认 OpenGL 上下文初始化在 UE 渲染线程外执行。 - 使用 `-opengl4` 启动参数强制 UE 使用 OpenGL 渲染器。 3. **性能问题**: - 限制 OSG 渲染帧率,避免与 UE 的主循环冲突。 - 考虑将 OSG 渲染结果输出到纹理,通过 UE 的材质系统显示。 --- ### **相关资源建议** - **官方文档**: - [OpenSceneGraph 编译指南](https://www.openscenegraph.com/documentation/) - [UE 第三方集成文档](https://docs.unrealengine.com/5.3/en-US/third-party-libraries-in-unreal-engine/) - **社区案例**: - 参考 UE 论坛中集成 Ogre3D 或 VTK 的讨论,寻找类似方案。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值