1 初始准備
1.1 CGKit簡介
CGKit是華為推出的一套高性能渲染框架,提供了渲染所需的原子能力,如材質、模型、燈光以及一些后期特效等。另外提供了高性能渲染組件,如抗鋸齒和基於Vulkan的多線程組件等。除此之外還提供了Smart Cache以及Pre-rotation等擴展能力,並整合了前沿計算機圖形學、計算機視覺和深度學習等最新研究成果。
1.2 官方指導
華為開發者的主頁如下:
https://developer.huawei.com/consumer/cn/
在該頁面有CGKit的鏈接:
點擊該鏈接即可轉到CGKit的主頁,其地址如下:
https://developer.huawei.com/consumer/cn/hms/huawei-computer-graphics/
這里會有CGKit的基本介紹,如下:
這里主要關注開發,點擊“查看文檔”,即可轉到如下地址:
該網頁是進行CGKit開發的官方頁面,有關介紹這里不再重復。
重點關注以下兩點即可:
其中示例代碼是一套Android Studio工程,含有開發CGKit的框架以及必要的代碼;SDK則是CGKit的核心,包括so文件以及對應頭文件。
需要注意的是,示例代碼需要做一定的修改才能開發出可運行的應用,主要是以下兩個原因:
- SDK是核心模塊,需要注冊華為賬號才能下載,故不包含在示例代碼中,需要下載后放入示例代碼工程中;
- 模型等文件有一定版權限制,故不包含在示例代碼中,需要自行下載或制作模型后放入示例代碼工程中。
1.3 開發准備
- 基於Kirin芯片的華為手機,目前支持Vulkan1.0版本,系統版本要求Android10以上;
- Android Studio,推薦使用最新版本(目前為4.0);
- NDK版本20.1.5948944;
- API等級29(Android 10)
- Build Tools版本29.0.3
2 開發詳細記錄
2.1 新建工程
使用Android Studio新建工程,這里為了方便不直接新建工程,而以官方示例代碼為例,直接用Android Studio打開即可。
打開示例代碼后,Android Studio會自動根據gradle進行有關內容的下載,比如該工程所指定的gradle-5.6.4。
雖然gradle配置了minSdkVersion為27,但是由於CGKit剛剛推出,兼容性問題還有待完善,因此可以改為29,僅在Android 10以上版本運行。
2.2 簽名
示例代碼中的gradle文件配置了簽名,這里可以刪除,僅作為自己開發驗證使用。當然,參考官方資料進行簽名生成,以及華為應用接入等完整步驟也可以。
2.3 集成SDK
在前面章節提到的SDK下載部分,將SDK下載下來,如下:
將include目錄拷貝到:
app\src\main\cpp
如下:
libs目錄拷貝到app目錄,如下:
接着點擊Build下的Refresh Linked C++ Projects:
則可以打開MainApplication.cpp,查看其中的接口都不再以紅色顯示,說明已經配置好了:
2.4 制作天空盒
根據官方文檔,天空盒應該自己制作,沒有隨示例代碼發布。天空盒有許多參考資料,這里參考:
https://www.cnblogs.com/alps/p/7112872.html
該網站也提供了天空盒資源下載,可以作為學習之用。另外提供一個cubemap天空盒示例網站,可在線查看天空盒效果:
https://doc.babylonjs.com/resources/playground_textures#cubetextures
選擇一個cubemap天空盒下載,然后編輯.cub配置文件內容如下:
width=512
height=512
depth=6
mipmap=1
face=6
channel=4
suffix=.png
這里width和height要和天空盒第一級mipmap的png圖像大小一致。
並根據指導將圖片命名,如下:
這些文件都放在env目錄,然后復制到示例工程的cubemap目錄即可。
這里要注意,目前CGKit僅支持四通道png格式的圖片,請勿使用其他格式。如果png不是四通道,可以使用windows畫圖程序打開,另存為png,則可以轉換成四通道。
2.5 准備模型
目前CGKit只支持obj格式的模型,且僅從obj中解析點和面,其中的mtl格式材質則被忽略。另外,解析支持法線、貼圖坐標解析及切線計算,但是面僅支持三角形模式,而不會進行多頂點組成的面的自動三角化。
開源免費的3D模型有許多,這里給一個參考網站:
https://www.turbosquid.com/Search/3D-Models/free/obj
對於本教程,這里選了如下的模型:
https://www.turbosquid.com/3d-models/medieval-blacksmith-low-poly-3d-model-1591136
效果如下:
2.5 開發應用
示例工程已經含有MainApplication.cpp有關代碼,這里僅需要稍作修改即可。
2.5.1 修改模型
首先在InitScene方法中,修改模型路徑:
String modelName = "models/black_smith/black_smith.obj";
接着修改貼圖路徑(將原來的jpg轉為png格式):
String texAlbedo = "models/black_smith/texture/black_smith.png";
這里只有一個貼圖,將原來的多余貼圖注釋掉:
//String texNormal = "models/Avatar/Normal_01.png";
//String texPbr = "models/Avatar/Pbr_01.png";
並將這兩個貼圖對應的SetTexture和SetSamplerParam注釋掉。
2.5.2 修改天空盒
修改CreateSkybox方法中的有關配置,將天空盒所用的立方體模型修改為:
String modelName = "models/cube/cube.obj";
這里cube是最簡單的模型,鏈接如下:
https://gist.github.com/MaikKlein/0b6d6bb58772c13593d0a0add6004c1c
並注意將MainApplication.h中的環境貼圖設置為:
String m_envMap = "cubemaps/env/env.cub";
這里與前面制作天空盒時所用的名稱相同。
2.6 運行驗證
效果如下:
如果運行出現問題,可以使用adb logcat進行日志查看以分析問題。CGKit也會在安卓標准日志中打印有關信息,且只記錄ERROR級別日志。如果想要對CGKit日志進行過濾,可以使用如下命令:
adb logcat | grep CGKit
3 FAQ
3.1 模型支持什么格式
目前CGKit僅支持obj格式的模型,可解析頂點、法線、貼圖坐標及面信息等;但不支持多余3頂點的面自動三角化,也不支持從mtl格式材質文件解析有關配置。
3.2 貼圖支持什么格式
目前CGKit僅支持四通道png格式圖片解析。
3.3 簽名是什么
安卓開發可能需要用到簽名,可以參考官方資料制作簽名文件。在平時開發調試時,可以將示例代碼中的簽名配置注釋掉。
3.4 Failed to get hire
日志打印中可能會發現“Failed to get hire”,這條是打點所用,無需理會。“打點”是指CGKit對自己運行情況進行記錄和上報,不影響渲染等模塊運行。
4 附錄
已經編譯好的apk,以及編譯的Android Studio工程已經放在百度網盤供下載參考,如下:
鏈接:https://pan.baidu.com/s/1x8wjYLqZ4CZpVUlo-ZDM1w 提取碼:3j8j
請注意,CGKit本身需要從官方下載SDK,即so和頭文件,所以這里提供的工程中是不含有該SDK的,請先注冊華為開發者后下載放入即可。該工程已經含有模型、貼圖以及天空盒等必備資源,僅缺少CGKit SDK而已。
原文鏈接:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201309841885850221&fid=18
原作者:捉不住的鼬鼠