nanogui源码下载:

A 、 https://github.com/wjakob/nanogui

B 、 https://github.com/dalerank/nanogui

B是fork的A,但是B有新的改进。

本文仅为参考,请以实际情况为准

本文演示环境: window10 + vs2015 up3 + cmake3.18

-----------------------------------------------------------------------

折腾

1、我想要实现界面半透明,控件不透明(透明度很差也可以)的效果。比如; 窗体时半透明的、窗体上的button, label等控件时不透明的或者透明度很差。于是想利用glfw的库函数实现窗体半透明。这里https://www.glfw.org/docs/3.3/group__window.html#gac31caeb3d1088831b13d2c8a156802e9)  找到了最新版glfw3.3.2中提供的库函数glfwsetwindowopacity,原型:

void glfwSetWindowOpacity    (    GLFWwindow *     window,
float opacity
)

这个函数是在3.3版本新加入的。

然而,查看nanogui使用的glfw库版本号是3.2。

为什么这样做? 为什么要调用库函数设置窗体透明效果?  答案:我现在是调用的基于OS的库函数实现的界面半透明,升级为调用glfw的库函数方便cross-platform. 而且代码更加简介。 好处多多。

2、nanogui是引用的项目glfw_objects. 这个项目在glfw3.2中是有生成的,但是升级到3.3以后,就没有这个项目了。

旧版3.2生成的项目一览:

用VS打开项目,可以清晰的看到这个项目生成的是一个静态库:

而新版3.3.2中生成的项目中没有glfw_object项目:

3、知道了上面的区别,就不能简单的替换nanogui下ext/glfw源码。否则,当执行cmake指令.的时候就会出现:

Configuring done
CMake Error at CMakeLists.txt:529 (add_library):
Error evaluating generator expression: $<TARGET_OBJECTS:glfw_objects> Objects of target "glfw_objects" referenced but no such target exists. CMake Error at CMakeLists.txt:529 (add_library):
Error evaluating generator expression: $<TARGET_OBJECTS:glfw_objects> Objects of target "glfw_objects" referenced but no such target exists. CMake Error at CMakeLists.txt:529 (add_library):
No SOURCES given to target: nanogui

cmake提示也说的很清楚: 无法找到以用的项目【glfw_objects】,该项目不存在。

回到 nanogui顶级目录下的 CMakeLists.txt ,找到出错所示的行前后代码:

if (CMAKE_GENERATOR STREQUAL Xcode)
set(XCODE_DUMMY ${CMAKE_CURRENT_BINARY_DIR}/xcode_dummy.cpp)
file(WRITE ${XCODE_DUMMY} "")
add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
${XCODE_DUMMY}
$<TARGET_OBJECTS:nanogui-obj>
$<TARGET_OBJECTS:glfw_objects>
)
else()
if (NANOGUI_GLFW_BACKEND OR NANOGUI_VULKAN_BACKEND)
add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
$<TARGET_OBJECTS:nanogui-obj>
$<TARGET_OBJECTS:glfw_objects>
)
else()
add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
$<TARGET_OBJECTS:nanogui-obj>
)
endif()
endif()

我这里,将【NANOGUI_GLFW_BACKEND】设置为ON。执行上面的分支到:

add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
$<TARGET_OBJECTS:nanogui-obj>
$<TARGET_OBJECTS:glfw_objects>
)

add_library将 glfw_object合并到nanogui项目。原因就是 3.3.2版本中没有生成对应的项目,造成nanogui引用项目glfw_objects失败,而且,在nanogui的CMakeLists,txt的前面,作者也说了,将glfw合并到nanogui。  原为如下 :

  # Two targets have now been defined: `glfw_objects`, which will be merged into
# NanoGUI at the end, and `glfw`. The `glfw` target is the library itself
# (e.g., libglfw.so), but can be skipped as we do not need to link against it
# (because we merge `glfw_objects` into NanoGUI). Skipping is required for
# XCode, but preferable for all build systems (reduces build artifacts).
# --------------------------------------------------------------------------------------
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw" "ext_build/glfw")

4、个人经验: 既然glfw是个第三方库,如果能动态链接该库肯定比nanogui目前这样引用来的方便,库之间保持了相对的独立,而且维护也方便,有什么更新,只需要替换对应的头文件和动态库(和lib文件)即可。 个人很少做 非基于windows的开发,所以,可能上述情况不太适用其他平台。

更新glfw

1、下载nanogui源码,我下载的是: https://github.com/dalerank/nanogui  , 要注意,一定要下载其对应的子模块,可以使用 git 指令查看其依赖的字库,或者  到  【这里】下载我之前就准备好的

 2、下载glfw:    https://www.glfw.org/download.html    和   https://github.com/glfw/glfw  都可以下载到。

还可以直接下载 已经编译好的Windows平台的库,我下载的是32位已经编译好的glfw库。

我这里: 使用的是VS2015up3. (c++11支持更友好)

3、解压nanogui源码,打开nanogui顶层目录下的CMakeLists.txt  , 找到 523 行, 将其修改为如下:

# XCode has a serious bug where the XCode project produces an invalid target
# that will not get linked if it consists only of objects from object libraries,
# it will not generate any products (executables, libraries). The only work
# around is to add a dummy source file to the library definition. This is an
# XCode, not a CMake bug. See: https://itk.org/Bug/view.php?id=14044
if (CMAKE_GENERATOR STREQUAL Xcode)
set(XCODE_DUMMY ${CMAKE_CURRENT_BINARY_DIR}/xcode_dummy.cpp)
file(WRITE ${XCODE_DUMMY} "")
add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
${XCODE_DUMMY}
$<TARGET_OBJECTS:nanogui-obj>
#$<TARGET_OBJECTS:glfw>
)
else()
if (NANOGUI_GLFW_BACKEND OR NANOGUI_VULKAN_BACKEND)
## 下面的这行是新增的,指定库的目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/lib)
add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
$<TARGET_OBJECTS:nanogui-obj>
#$<TARGET_OBJECTS:glfw> ## 这里是需要你手动修改的
) target_link_libraries(nanogui glfw3) ## 这里是新增的代码
else()
add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
$<TARGET_OBJECTS:nanogui-obj>
)
endif()
endif()

核心:

    ## 下面的这行是新增的,指定库的目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/lib)
add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
$<TARGET_OBJECTS:nanogui-obj>
#$<TARGET_OBJECTS:glfw> ## 这里是需要你手动修改的
) target_link_libraries(nanogui glfw3) ## 这里是新增代码

我将其改为了动态链接 glfw库,就这样。

4、将下载好的glfw的lib文件拷贝到xx/nanogui/ext/glfw/lib目录下,上面的CMakeLists.txt中指向了在这个目录下查找库文件(可自定义其他路径)

5、CMake执行 nanogui 目录下的 CMakeLists.txt , 生成解决方案(我这里已经打开过解决方案了):

6、将 glfw的dll文件复制到解决方案输出目录,我这里是上面图片中的debug目录(这里的批处理文件是我自己写的,删除调试文 pdb, ilk 等):

7、运行example,就可以看到和nanogui在GitHub上的示例图片,我这里就放一张。(这里,example, 是大佬提前写好的,非我自己调用glfw库实现半透明的示例)

更新

    更新时间: 2020-0802 15:26

从  https://github.com/wjakob/nanogui   fork了一份到自己的仓库, 并做了一下更改:

1.删除 nanogui 对 glfw 子模块的引用

2.添加glfw3.3.2源码到项目,

fork 地址:  https://github.com/mohistH/nanogui

添加更新后, 生成项目, 编译输出结果:

nanogui之更新子模块glfw3.3.2踩坑总结的更多相关文章

  1. Java 热更新 Groovy 实践及踩坑指南

    Groovy 是什么? Apache的Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似Python.Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用 ...

  2. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  3. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  4. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~

    这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...

  5. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  6. jQuery升级踩坑大全

    jQuery升级踩坑大全 背景 jQuery想必各个web工程师都再熟悉不过了,不过现如今很多网站还采用了很古老的jQuery版本.其实如果早期版本使用不当,可能会有DOMXSS漏洞,非常建议升级到j ...

  7. jQuery版本升级踩坑大全

    背景 -------------------------------------------------------------------------------- jQuery想必各个web工程师 ...

  8. React Native Android配置部署踩坑日记

    万事开头难 作为一只进入ECMAScript世界不久的菜鸟,已经被React Native的名气惊到了,开源一周数万星勾起了我浓烈的兴趣.新年新气象,来个HellWorld压压惊吧^_^(故意少打个' ...

  9. 【踩坑记】从HybridApp到ReactNative

    前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...

随机推荐

  1. awk多文件处理时的分隔符?

    目录 问题来源 解决方法 问题来源 我有两个文件,一个是plink过滤后得到的.fam文件(空格分隔):另一个是样本对应关系文件(tab分隔). 文件1: 文件2: 两个文件匹配,awk常规操作.这里 ...

  2. 【机器学*与R语言】2-懒惰学*K*邻(kNN)

    目录 1.理解使用KNN进行分类 KNN特点 KNN步骤 1)计算距离 2)选择合适的K 3)数据准备 2.用KNN诊断乳腺癌 1)收集数据 2)探索和准备数据 3)训练模型 4)评估模型的性能 5) ...

  3. mongodb-to-mongodb

    python3用于mongodb数据库之间倒数据,特别是分片和非分片之间. 本项目是一个集合一个集合的倒. 参考了logstash,对于只增不减而且不修改的数据的可以一直同步,阻塞同步,断点同步.改进 ...

  4. JForum论坛安装以及部署

    转载链接:https://blog.csdn.net/jhyfugug/article/details/79467369 首先安装JForum之前,先准备好安装环境Windows7+JDK+Tomca ...

  5. C#序号

    OnRowCreated="gridViewCorrection_RowCreated" <asp:BoundField HeaderText="序号" ...

  6. mysql事务控制语言TCL

    Transaction Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元作为不可分割的整体执行.如果某个语句执行错误,整个单元回滚到最初的状态. ...

  7. Spark(八)【广播变量和累加器】

    目录 一. 广播变量 使用 二. 累加器 使用 使用场景 自定义累加器 在spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的 ...

  8. Spark(七)【RDD的持久化Cache和CheckPoint】

    RDD的持久化 1. RDD Cache缓存 ​ RDD通过Cache或者Persist方法将前面的计算结果缓存,默认情况下会把数据以缓存在JVM的堆内存中.但是并不是这两个方法被调用时立即缓存,而是 ...

  9. HTTP请求 Java API

    1.导入依赖 <dependency> <groupId>commons-httpclient</groupId> <artifactId>common ...

  10. 容器之分类与各种测试(四)——unordered_set和unordered_map

    关于set和map的区别前面已经说过,这里仅是用hashtable将其实现,所以不做过多说明,直接看程序 unordered_set #include<stdexcept> #includ ...