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
添加更新后, 生成項目, 編譯輸出結果: