目录

OpenSceneGraph学习(1)

前言

出于对老牌渲染引擎 OpenSceneGraph (简称OSG) 的学习借鉴,先从其Example 开始学习了解。

环境准备

以 Windows 系统为例,必备软件如下:

  • MicroSoft Visual Studio (例如我的是 Microsoft Visual Studio Professional 2019)
  • CMake (例如我的是 CMake 3.25.3)
  • Git

源码Clone

打开 GitBash,到指定目录(比如在目录 D:\github_sourecs_projects\OSG) clone 源码:

1
2
cd  /d/github_sourecs_projects/OSG
git clone https://github.com/openscenegraph/OpenSceneGraph.git

版本问题:我选择的最新的master,最新打的 tag 是 OpenSceneGraph-3.6.5

下载依赖库/数据包

  • 依赖库 OSG 针对大多数人需要的 OSG-CORE 解决好了依赖关系,但对于其他 Examples 可能需要的依赖库,是另外给了 3rdParty 需要自己下载,即 Optional 依赖。 所以如果不处理这个第三方依赖包的话,默认配置 CMake 的时候可能会看到如下信息:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
-- The following OPTIONAL packages have been found:

 * GDAL
 * CURL
 * OpenGL
 * ZLIB
 * PNG
 * TIFF
 * Threads

-- The following OPTIONAL packages have not been found:

 * Freetype
 * ilmbase
 * Inventor

所以我们需要前往:OSG 官网Doc/Deps 下载对应的依赖包,解压缩到相关目录。

比如我下载了 vs2017_x64_3rdParty, 解压到 D:\github_sourecs_projects\OSG\3rdParty_VS2017_v141_x64_V11_small,该目录再下一级就是 3rdParty_x64

只有对应的依赖包检测到了,在 Plugins 解决方案条目下才会看到对应的的 target。

以 Jpeg 为例,手动设置 JPEG_INCLUDE_DIR 等变量,或者使用上述准备好的package 让OSG 内部去检测,总之就是能让 jpeg 这个target 可以被 find,对应的 osg-jpeg 这个target 才会在工程中,进而才能打开 jpg/jpeg 等文件格式。

其他的依赖包同理。

  • 数据包

    数据包是有专门的一个 Git 仓库的,openscenegraph/OpenSceneGraph-Data ,存放的是跑 Examples 需要的 模型数据、Shader、图片等资源。对应 OSG 的版本也会打 tag,目前我 Clone 时直接取的是最新的数据。

    1
    2
    
    cd /d/github_sourecs_projects/OSG
    git clone https://github.com/openscenegraph/OpenSceneGraph-Data.git
    

环境变量设置

基于上面提及的根目录:D:\github_sourecs_projects\OSG

  • 配置系统环境变量 OSG_3RDPARTY_DIRD:\github_sourecs_projects\OSG\3rdParty_VS2017_v141_x64_V11_small\3rdParty_x64
  • 配置系统环境变量 OSG_FILE_PATHD:\github_sourecs_projects\OSG\OpenSceneGraph-Data;D:\github_sourecs_projects\OSG\OpenSceneGraph-Data\Images
  • 对系统环境变量 PATH,新增 D:\github_sourecs_projects\OSG\3rdParty_VS2017_v141_x64_V11_small\3rdParty_x64\x64\bin

Configure 生成工程

在根目录 D:\github_sourecs_projects\OSG 新建个文件 build.sh ,输入以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

build_dir="build"
mkdir -p $build_dir

pushd $build_dir

cmake ../OpenSceneGraph  -DBUILD_OSG_EXAMPLES=ON  

popd

然后 GitBash 命令行 cd 到根目录后,执行 ./build.sh 进行 Configure。

对得到的工程 OpenSceneGraph.sln ,打开后解决方案管理器如下图:

osg-vs-suolution

源码编译

  • 先右键 Plugins 生成所有 Plugin 依赖,包括 jpg,rgb 这些文件的读取支持,耐心等待所有构建完成;
  • 然后展开 Examples ,针对自己想要了解的任何一个 Example,鼠标右键设置为启动项目,然后 Debug/Release 就 Run 起来吧。

效果举例

正常运行 Example 的话,命令行窗口是不会有 error 信息打印的。

Examples_osgshadown 举例,正常效果如下:

OSG_1st_osg_shadows

FAQ

  • 编译正常,但运行窗口报错 “Can not read xxx, not find plugin” 之类的错误,而且现象也不对?

    是因为 Plugin 依赖没有解决好,比如 jpeg 的 lib 没有安装好。

  • OSG 的头文件大部分都是不带 .h 后缀的,Visual Studio 看着就是没有高亮的,也不方便调试

    因为 OSG 是将头文件应用对标学习STL的,类似 #include <iostream> , OSG 里类似地 #include <osg/Texture2D>

    所有的类都管理在命名空间 osg:: 中。VS 支持将无扩展名的文件识别为 C/C++ 类型。

    想要高亮显示? 可以的。

    VS 设置路径:

    中文版本:工具 -> 选项 -> 文本编辑器 -> 文件扩展名 -> 勾选“将无扩展名文件映射到” -> 右下角下拉选择 MicroSoft Visual C++ -> 确认应用;

    英文版本:Tools-Options -> Text Editor -> File Extension -> check “Map Extensionless Files To” -> 右下角下拉选择 “Microsoft Visual C++” -> Yes.