【从零搭建Osgearth】03.Linux环境安装中的问题

1. OsgQt版本问题

  1. 这是一个深坑,笔者在这里提醒,安装时一定要注意。
  2. 首先要明确,osg、osgearth、osgQt三个框架的版本是相互依赖的,例如你安装了最古老的osg3.4,那么就只能安装2.x版本的osgearth,因此一定要在最开始确定好这三个玩意儿的版本,如何确定呢?

首先判断你是否有这样一个需求:需要利用OsgQopenGL库(即OsgQt库)。将Osgearth嵌入到Qt程序中。

  1. 为什么要做这个判断呢?因为大多数项目,我们需要的都不是一个孤立的Osgearth球,最终还是要一个完整的项目工程,而实现这个完整工程的方式,往往是借用OsgQOpenGL库。
  2. 如果你没有这方面的需求,那么就非常简单了,直接选取最新版本安装Osg和Osgearth就可以了!
  3. 如果你需要OsgQt库的支持,那么在linux(麒麟)上安装就比较费劲了,因为OsgQt是依赖于OpenGL的,而OpenGL在linux上做版本更换是非常困难的一件事。因此,要尽可能在最开始就把版本固定下来。
  4. 首先,查询你的linux机器安装的OpenGL版本,如果是OpenGL3,那么恭喜你,事情比较简单了,在利用cmake安装Osg和Osgearth时,你只需要勾选OpenGL3相关的选项就可以了。(由于笔者的开发环境是离线环境,不好截图,关于cmake的配置可以搜索其他博客)
  5. 然而,如果你的版本是OpenGL2,那么就要注意了。
  6. 当你在cmake中按照OpenGL2配置相关选项,是可以正常安装成功的。但是,在调用osgQOpenGL库时,会出现earth球无法加载显示的情况。
  7. 这是因为OsgQOpenGL库依赖的三维渲染相关的函数,是基于OpenGL3的。因此在OpenGL2环境下无法调用成功。
  8. 对于这种棘手问题, 笔者提出两种解决方案:

1. 更新本机OpenGL版本到3.x或4.x;这种方式是最简单、根本的,但是正如上文所说,linux环境更新opengl是比较困难的,笔者没能成功,大家可以按此思路尝试,如果成功的话可以在评论区分享。
2. 降级osg、osgearth、OSGQOpenGL版本。本质是降级osgqt库的版本,而osg和osgearth的降级只是为了适配OSGQOpenGL的版本。但是,这个方法依旧有漏洞,因为OsgQt的早期版本压根不叫OSGQOpenGL,就叫OsgQt。因此,如果要使用旧版本,务必提前做好攻略,保证旧版本能够满足你的开发要求。
3. 第三种思路,也是笔者采用的思路:不依靠OSGQOpenGL库,把osgearth拆成一个独立程序,再通过数据收发使其在显示效果上像一个完整程序。

以上是笔者给出的解决思路,其实主要还是为大家点出OpenGL版本问题这个大坑,避免大家走弯路,如果针对这个问题大家有更好的解决措施,也欢迎在评论区分享,以帮到后人。

2. 找不到emmintrin.h

这也是linux下源码安装的一个经典坑了。
问题原因很简单:emmintrin.h这个头文件,本身不是在aarch64中使用的指令集,需要将其改写为neon的代码,即在arm架构下可以使用的指令集。
方法是什么呢?

  1. 首先,根据make && make install时的报错定位到报错的位置,一般是某个.h或.cpp文件的#include语句。修改其#include <emmintrin.h>为:#include <sse2neon.h>
  2. 将 sse2neon.h 头文件放到/usr/local/include或者/usr/include(总之就是工程能找到的环境变量位置,你自己配置好的地方也可以),使得安装时可以查询到。
  3. sse2neon.h的下载地址:
    https://github.com/DLTcollab/sse2neon/

Osg shader undeclared

翻译一下就是osg 着色器 未定义,报错提示一般为:

VERTEX glCompileShader "oe_logDepth_vert" FAILED
VERTEX Shader "oe_logDepth_vert" infolog:
0:3(12): warning: extension GL_ARB_gpu_shader5' unsupported in vertex shader 0:4(12): warning: extension GL_ARB_gpu_shader_int64' unsupported in vertex shader
0:10(6): error: gl_ProjectionMatrix' undeclared 0:10(6): error: operands of ==' must have the same type
0:12(27): error: gl_ProjectionMatrix' undeclared 0:12(19): error: no matching function for call to inverse(error)'; candidates are:
0:12(19): error: mat2 inverse(mat2)
0:12(19): error: mat3 inverse(mat3)
0:12(19): error: mat4 inverse(mat4)
0:13(18): warning: `clip2view' used uninitialized

VERTEX glCompileShader "oe_rex_init_model" FAILED
VERTEX Shader "oe_rex_init_model" infolog:
0:3(12): warning: extension GL_ARB_gpu_shader5' unsupported in vertex shader 0:4(12): warning: extension GL_ARB_gpu_shader_int64' unsupported in vertex shader
0:26(19): error: `gl_MultiTexCoord0' undeclared

VERTEX glCompileShader "oe_rex_normalMapVS" FAILED
VERTEX Shader "oe_rex_normalMapVS" infolog:
0:5(12): warning: extension GL_ARB_gpu_shader5' unsupported in vertex shader 0:6(12): warning: extension GL_ARB_gpu_shader_int64' unsupported in vertex shader
0:31(23): warning: oe_layer_tilec' used uninitialized 0:36(35): error: gl_NormalMatrix' undeclared
0:36(35): error: operands to arithmetic operators must be numeric
0:36(25): error: no matching function for call to `normalize(error)'; candidates are:
0:36(25): error: float normalize(float)
0:36(25): error: vec2 normalize(vec2)
0:36(25): error: vec3 normalize(vec3)
0:36(25): error: vec4 normalize(vec4)

VERTEX glCompileShader "oe_rex_morph" FAILED
VERTEX Shader "oe_rex_morph" infolog:
0:6(12): warning: extension GL_ARB_gpu_shader5' unsupported in vertex shader 0:7(12): warning: extension GL_ARB_gpu_shader_int64' unsupported in vertex shader
0:91(40): warning: oe_layer_tilec' used uninitialized 0:94(29): error: gl_ModelViewMatrix' undeclared
0:94(29): error: operands to arithmetic operators must be numeric
0:100(32): warning: wouldBePositionView' used uninitialized 0:120(7): warning: oe_terrain_vertexMarker' used uninitialized
0:122(62): warning: vp_Normal' used uninitialized 0:124(34): error: gl_MultiTexCoord1' undeclared
0:124(34): error: type mismatch
0:124(29): error: cannot construct vec4' from a non-numeric data type 0:125(24): error: gl_MultiTexCoord2' undeclared
0:125(24): error: type mismatch
0:130(30): warning: oe_layer_tilec' used uninitialized 0:131(24): warning: oe_layer_tilec' used uninitialized
0:132(28): warning: oe_layer_tilec' used uninitialized 0:135(32): warning: oe_layer_tilec' used uninitialized
0:137(19): warning: neighborVertexModel' used uninitialized 0:141(28): warning: vp_Normal' used uninitialized
0:141(39): warning: `neighborNormal' used uninitialized

VERTEX glCompileShader "main(vertex)" FAILED
VERTEX Shader "main(vertex)" infolog:
0:2(12): warning: extension GL_ARB_gpu_shader5' unsupported in vertex shader 0:3(12): warning: extension GL_ARB_gpu_shader_int64' unsupported in vertex shader
0:51(14): error: gl_Vertex' undeclared 0:52(14): error: gl_Normal' undeclared
0:53(13): error: gl_Color' undeclared 0:57(14): error: gl_ModelViewMatrix' undeclared
0:57(14): error: operands to arithmetic operators must be numeric
0:58(24): error: gl_NormalMatrix' undeclared 0:58(24): error: operands to arithmetic operators must be numeric 0:58(14): error: no matching function for call to normalize(error)'; candidates are:
0:58(14): error: float normalize(float)
0:58(14): error: vec2 normalize(vec2)
0:58(14): error: vec3 normalize(vec3)
0:58(14): error: vec4 normalize(vec4)
0:65(14): error: gl_ProjectionMatrix' undeclared 0:65(14): error: operands to arithmetic operators must be numeric 0:68(35): warning: oe_terrain_vertexMarker' used uninitialized
0:69(28): warning: oe_layer_opacity' used uninitialized 0:70(30): warning: oe_rex_morphFactor' used uninitialized
0:71(25): warning: oe_layer_texc' used uninitialized 0:72(31): warning: oe_layer_texcParent' used uninitialized
0:73(30): warning: oe_normalMapCoords' used uninitialized 0:74(27): warning: oe_UpVectorView' used uninitialized
0:75(32): warning: oe_normalMapBinormal' used uninitialized 0:78(26): warning: oe_layer_tilec' used uninitialized

glLinkProgram 0x7f979c01f220"ArcGISServerImageLayer" FAILED
Program "ArcGISServerImageLayer" infolog:
error: linking with uncompiled/unspecialized shadererror: linking with uncompiled/unspecialized shadererror: linking with uncompiled/unspecialized shadererror: linking with uncompiled/unspecialized shadererror: linking with uncompiled/unspecialized shader
Segmentation fault (core dumped)

这个问题的本质和第一个问题一样,都是你在最开始cmake的时候,没有把opengl的配置项配置对导致的。要么是版本选错(明明本机是opengl2,但却用了gl3的相关配置);要么是配置项设置错(有的没有勾选\有的多勾选了)。重新审查cmake安装一遍即可。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值