一、FFmpeg编译
1、配置msys2环境
- 在 msys2官网中下载msys2-x86_64-{date}.exe安装
- 修改msys64/msys2_shell.cmd文件中rem MSYS2_PATH_TYPE=inherit为set MSYS2_PATH_TYPE=inherit,记得备份
- 打开vs x64命令行提示符工具,运行msys2_shell.cmd,输入以下命令初始化环境
pacman -Syu
pacman -S make
pacman -S diffutils
pacman -S yasm
pacman -S nasm
mv /usr/bin/link.exe /usr/bin/link.exe.bak
2、编译x264源码
- (注意提前进入某个目录创建一个FFmpeg_Build目录,源码解压在同级目录下)
- https://github.com/mirror/x264拉下来
- msys64进入x264目录,执行命令:
curl "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" > config.guess
sed -i 's/host_os = mingw/host_os = msys/' configure
CC=cl ./configure --prefix=./../FFmpeg_Build --enable-shared
make -j 16 && make install
mv ./../FFmpeg_Build/lib/libx264.dll.lib ./../FFmpeg_Build/lib/libx264.lib
3、编译FFmpeg源码
export CC=cl
./configure \
--prefix=./../FFmpeg_Build \
--toolchain=msvc \
--arch=x86_64 \
--enable-yasm \
--enable-asm \
--enable-shared \
--disable-static \
--disable-programs \
--enable-avresample \
--enable-libx264 \
--enable-gpl \
--extra-ldflags="-LIBPATH:./../FFmpeg_Build/lib/" \
--extra-cflags="-I./../FFmpeg_Build/include/"
make -j 16 && make install
- 至此FFmpeg编译完成,所有文件都在FFmpeg_Build下
二、编译OSG源码
1、下载源码及数据
- 源码在OSG Git地址直接拉取
- 3rdParty_VS2017_v141_x64_V11_full 和 OpenSceneGraph-Data-3.4.0在osg官网下载
2、使用CMake编译
- 创建一个OSG-3.7.0+OSGEARTH-3.4目录,将源码都解压在同级目录下,并且多创建一个OSG-3.7.0+OSGEARTH-3.4用于存放编译后的文件,目录下分别创建OSG、OSGEarth目录,方便区分
- 建议打开CMake前将3rdParty_x64\x64目录设置为环境变量
- 打开CMake、选择OSG的源码根目录,点击Configure,第一栏选择vs2017,第二栏选择x64。然后选择Finish开始加载
![](https://img-blog.csdnimg.cn/0d8e3b93d58a4232b6975525cf75d429.png)
- 搜索ACTUAL_3RDPARTY_DIR,将值设置为3rdParty_x64\x64路径
![](https://img-blog.csdnimg.cn/07015876866f475eade3eebdb921956a.png)
- 搜索BUILD_OSG_EXAMPLES,勾选为选中
- 搜索CMAKE_INSTALL_PREFIX,值设置为OSG-3.7.0+OSGEARTH-3.4/OSG-3.7.0+OSGEARTH-3.4/Osg
- 点击OPENGL选项展开,修改OPENGL_HEADER1项为#include <GL/glcorearb.h>,修改OPENGL_PROFILE项为GL3
![](https://img-blog.csdnimg.cn/1dd6e44a9a8d402382ffe7bc0255a570.png)
- 注意: OSGEarth3.3版本必须要OSG支持GL3,所以需要下载另外的GL API文件
- OpenGL-Registry、 EGL-Registry 将OpenGL的GL文件夹和EGL的KHR文件夹复制到OSG源码的include目录下
- 点击OSG项展开,选中
OSG_GL3_AVAILABLE
OSG_GL1_AVAILABLE
OSG_GL2_AVAILABLE
OSG_GLES1_AVAILABLE
OSG_GLES2_AVAILABLE
OSG_GL_DISPLAYLISTS_AVAILABLE
OSG_GL_FIXED_FUNCTION_AVAILABLE
OSG_GL_MATRICES_AVAILABLE
OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE
OSG_GL_VERTEX_FUNCS_AVAILABLE
- 修改OSG_GL_CONTEXT_VERSION项为3.3
![](https://img-blog.csdnimg.cn/9444a4389c304ceba29010c43a8c708c.png)
- 然后检查一下你需要使用的库目录是否正常,有可能会找不到lib文件,排查完之后点击Configure,没问题之后点击Generate、Open Project
![](https://img-blog.csdnimg.cn/69a33510d0eb41039fba1357d0c40574.png)
3、使用VS2017编译源码
- 编译前先进入osg/Texture头文件,将第60行和第69行注释掉,进入Texture.cpp 添加
#include <algorithm>
- 选择Release和x64,右击ALL_BUILD开始编译,Debug模式自行选择,等待编译完成,我已经生成过了,过程比较漫长,就随便截图了
![](https://img-blog.csdnimg.cn/caa52ce8be084ba3b3ee460121a94395.png)
- 然后点击INSTALL安装到之前选择的目录中,注意:这个目录的include中是不带之前的GL和KHR文件夹的,记得手动复制过来
- 测试代码就不搞了,自行编写或者直接运行
osg_viewer.exe cow.osg
, 模型在OpenSceneGraph-Data\data中有 - 将OSG安装目录设为环境变量方便下面的编译
编译OSGEarth源码
1、 下载源码
- 进入OSGEarth Git地址中release里下载3.4的源码
- 注意:在src/third_party下三个蓝色链接的项目需要手动下载然后拷贝到此目录下
![](https://img-blog.csdnimg.cn/b09a25b5cab84298b3ea11729eacda8e.png)
1.1、 下载并编译需要的库
- 下载SQLite3源码并编译Release版本
- 下载glew源码,进入glew-2.1.0\build\vc12打开sln升级到vs2017,编译Release版本
2、 CMake编译源码
- 步骤与OSG一致,目录选择OSGEarth源码目录
- 由于设置了环境变量,所以应该不会报错
- 搜索CMAKE_INSTALL_PREFIX,值设置为OSG-3.7.0+OSGEARTH-3.4/OSG-3.7.0+OSGEARTH-3.4/Earth
![](https://img-blog.csdnimg.cn/b6f6b2888fc645aab90598d0d628c46b.png#pic_center)
- 然后把SQLite3和GLEW的目录设置进去
![](https://img-blog.csdnimg.cn/cba69f17f3b8418296d9a3d96300037b.png)
- 展开OSGEARTH选项,勾选OSGEARTH_INSTALL_SHADERS,其中有各种三方插件,按需勾选即可,我这用上了Triton和Silverlining,也建议勾选上,不然后面用到也要再编译
![](https://img-blog.csdnimg.cn/c478f78d68c44537849519d275b162c4.png)
- 最后点击Generate生成,等待编译完成
3、 使用vs2017编译源码
- TritonDrawable.cpp 中修改的代码
osgEarth::NativeProgramAdapterCollection& adapters = _adapters[ state->getContextID() ];
auto cid = GLUtils::getSharedContextID(*state);
osgEarth::NativeProgramAdapterCollection& adapters = _adapters[cid];
(::Triton::TextureHandle)_cubeMap->getTextureObject( state->getContextID() )->id(),
(::Triton::TextureHandle)_cubeMap->getTextureObject(cid)->id(),
(::Triton::TextureHandle)_planarReflectionMap->getTextureObject( state->getContextID() )->id(),
(::Triton::TextureHandle)_planarReflectionMap->getTextureObject(cid)->id(),
osg::GLExtensions* ext = osg::GLExtensions::Get(state->getContextID(), true);
osg::GLExtensions* ext = osg::GLExtensions::Get(cid, true);
- TritonHeightMap.cpp 中修改的代码
osg::GLExtensions* ext = osg::GLExtensions::Get(state.getContextID(), true);
auto cid = GLUtils::getSharedContextID(state);
osg::GLExtensions* ext = osg::GLExtensions::Get(cid, true);
osg::Texture::TextureObject* obj = local._tex->getTextureObject(ri.getContextID());
auto cid = GLUtils::getSharedContextID(*ri.getState());
osg::Texture::TextureObject* obj = local._tex->getTextureObject(cid);
- SilverLiningCloudsDrawable.cpp中修改
osgEarth::NativeProgramAdapterCollection& adapters = _adapters[ state->getContextID() ];
auto cid = GLUtils::getSharedContextID(*state);
osgEarth::NativeProgramAdapterCollection& adapters = _adapters[cid];
#if ((SILVERLINING_MAJOR_VERSION > 6) || (SILVERLINING_MAJOR_VERSION == 6 && SILVERLINING_MINOR_VERSION >= 24))
adapters.push_back(new osgEarth::NativeProgramAdapter(state, _SL->getAtmosphere()->GetBillboardShaderInstanced(), NULL, "BillboardShaderInstanced"));
#endif
- SilverLiningContext.cpp中修改
osg::Vec3d north = osg::Vec3d(0, 1, 0);
osg::Vec3d north = _srs->isGeographic() ? osg::Vec3d(0, 0, 1) : osg::Vec3d(0, 1, 0);
- SilverLiningAPIWrapper中AtmosphericConditions类
GetLocation
函数下添加void SetTime(tm* local_time);
cpp中添加以下代码设置时区
void AtmosphericConditions::SetTime(tm* local_time)
{
::SilverLining::LocalTime lt;
lt.SetHour(local_time->tm_hour);
lt.SetMinutes(local_time->tm_min);
lt.SetSeconds(local_time->tm_sec);
lt.SetDay(local_time->tm_mday);
lt.SetMonth(local_time->tm_mon + 1);
lt.SetYear(local_time->tm_year + 1900);
HANDLE->SetTime(lt);
}
- 然后选择Release、x64右击ALL_BUILD编译,编译完成后INSTALL,完成之后所有文件就都在earth目录中了
- 最后把所有的Bin、Include、Lib文件夹合并,再清除编译用的环境变量,把合并后的目录设置为环境变量,vs中添加即可使用
![](https://img-blog.csdnimg.cn/cbad412a3ecf4129800c96ef1533a5b6.png)
![](https://img-blog.csdnimg.cn/1df5cda76a614ceaa5e7e3b55568b642.png)