給3D模型及環境場景渲染出兼具質感和真實感的材質效果,需要經歷幾步?
顯然,目前的3D模型材質渲染技術,還無法實現簡單幾步就能搞定的標准化作業來量化,完成一個質量過關的3D模型渲染,一般需要:
1、准備一個內容豐富的貼圖、材質庫:渲染想要的材質效果,需要根據具體模型場景的形狀細節及復雜程度,針對性收集對應的素材外觀和紋理素材,耗時與模型的復雜程度呈正比,並且市面上大部材質付費使用,造價成本高。
2、從零開始調參:現有的3D建模工具都要以豐富的參數來實現建模渲染操作,通過調整參數來設置和控制模型。
3、渲染效果依賴美術經驗:3D建模師逐漸成為緊俏的行業人才,也說明了3D模型制作需要技術和經驗老道的從業者,伴隨着模型及場景的多樣化以及制作的精細化,美術經驗直接關系成品質量水准。
傳統作業方式確實細活慢工,但逆襲繁瑣步驟的材質生成能力已經出現啦!今天給大家帶來的材質生成能力,簡單易用,渲染高質量材質效果,只需3步!
以較為常見的3D游戲所需的復雜場景舉例,給一個多物體組合的復雜場景渲染材質,只需如下的簡單操作:

1、使用RGB相機拍攝所需材質實物照片。

2、將RGB照片自動生成材質素材。

3、材質貼圖,完成渲染。

華為3D建模服務提供的材質生成能力,將操作繁瑣的材質生成及渲染過程簡化提速,基於AI輔助材質生成,提升三維模型外觀創作效率,將技術美術的經驗和制作規范,固化為材質預設實例,復用有價值的經驗與規范,提升內容制作效率,降低材質制作成本。
材質生成能力
提供將RGB圖像轉換為PBR材質的能力,用戶通過集成SDK,僅需拍攝一張或多張RGB圖片,便可一鍵生成4種材質貼圖,包括diffuse map /normal map/specular map/roughness map。AI輔助PBR素材生成,從照片生成材質,解放人力操作成本,滿足消費級3D材質應用。

輸入圖片文件規格
- 軟硬件要求: 普通RGB手機,不要求RGB-D\LiDAR, 全Android機型
- 支持類型:混凝土、大理石、岩石、碎石、磚、石膏、黏土、金屬、木材、樹皮、皮革、織物、漆面、塑料、合成材料、碎石、大地(草地、沙灘等)
- 輸入圖像的要求:輸入圖像分辨率達到1~4K,輸入圖像中無接縫、無亮斑、陰影、倒影
- 輸出貼圖分辨率:1k(10241024px) 2k(20482048px)
- SDK包大小:88KB
- 准確率:渲染后SSIM>0.9
應用場景
3D建模的材質生成能力一鍵實現現實中各色紋理的木材轉化為PBR材質,具有高還原度,極大提高場景的構建效率。簡單易用,效果佳,廣泛應用於3D內容制作領域。
- 電商行業:使用3D模型展示商品,為用戶提供逼近真實的線上購物體驗。
- 展覽行業:高價值的展品及文物,以3D模型形式展示,方便用戶細致觀覽展品細節。
- 游戲行業:如室內場景里地板、桌子、牆面等所需的木材,打造身臨其境的游戲體驗。
開發准備
1、集成HMS Core SDK
1.1、添加當前應用的AppGallery Connect配置文件
如果在AppGallery Connect中開通了相關服務則需要將“agconnect-services.json”文件添加到您的App中。
步驟 1:登錄AppGallery Connect網站,點擊“我的項目”。
步驟 2:在項目列表中找到您的項目,在項目中點擊需要集成HMS Core SDK的應用。
步驟 3:在“項目設置 > 常規”頁面的“應用”區域,點擊“agconnect-services.json”下載配置文件。

步驟 4:將“agconnect-services.json”文件拷貝到應用級根目錄下。

1.2、配置HMS Core SDK的Maven倉地址
步驟 1:打開Android Studio項目級“build.gradle”文件。

步驟 2:添加HUAWEI agcp插件以及Maven代碼庫。
- 在“buildscript > repositories”中配置HMS Core SDK的Maven倉地址。
- 在“allprojects > repositories”中配置HMS Core SDK的Maven倉地址。
- 如果App中添加了“agconnect-services.json”文件則需要在“buildscript > dependencies”中增加agcp插件配置。
buildscript {
repositories {
google()
jcenter()
// 配置HMS Core SDK的Maven倉地址。
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
...
// 增加agcp插件配置。
classpath 'com.huawei.agconnect:agcp:1.4.2.300'
}
}
allprojects {
repositories {
google()
jcenter()
// 配置HMS Core SDK的Maven倉地址。
maven {url 'https://developer.huawei.com/repo/'}
}
}
注:Maven倉地址無法直接在瀏覽器中打開訪問,只能在IDE中配置。如需添加多個Maven代碼庫,請將華為公司的Maven倉地址配置在最后。
1.3、添加編譯依賴
步驟 1:打開應用級的“build.gradle”文件。

步驟 2:在“dependencies”中添加如下編譯依賴。
- 材質生成
dependencies {
implementation 'com.huawei.hms:modeling3d-material-generate:{version}'
}
- 3D物體建模
dependencies {
implementation 'com.huawei.hms:modeling3d-object-reconstruct:{version}'
}
注:{version}替換為實際的Kit依賴版本,版本號索引請參見2 版本更新說明。例如:implementation 'com.huawei.hms:modeling3d-material-generate:1.0.0.300'和implementation 'com.huawei.hms:modeling3d-object-reconstruct:1.0.0.300'。
步驟 3:添加agcp插件配置。請根據實際情況選擇:
- 方式一:在文件頭部聲明下一行添加如下配置。
apply plugin: 'com.huawei.agconnect'
- 方式二:在plugins中添加如下配置。
plugins {
id 'com.android.application'
// 添加如下配置
id 'com.huawei.agconnect'
}
2、多語言設置
- 如果您的應用不需要設置只支持某些特定語言,則請忽略本步驟。應用將默認支持所有HMS Core SDK支持的語言。
- 如果您的應用需要設置只支持某些特定語言,則可通過本步驟配置。
a. 打開應用級的“build.gradle”文件。

b.在“android > defaultConfig”中新增“resConfigs”,配置需要支持的語種,配置格式如下:
android {
defaultConfig {
...
resConfigs "en", "zh-rCN", "需要支持的其他語言"
}
}
HMS Core SDK支持的語言列表請參見HMS Core SDK支持的語言。
3、同步工程
在完成以上的配置后,點擊工具欄中的gradle同步圖標,完成“build.gradle”文件的同步,將相關依賴下載到本地。

注:如果出現錯誤,請檢查網絡連接是否正常,以及檢查“build.gradle”文件是否正確。
4、配置混淆腳本
您編譯APK前需要配置混淆配置文件,避免混淆HMS Core SDK導致功能異常。
步驟 1:在應用級根目錄下打開混淆配置文件“proguard-rules.pro”,加入排除HMS Core SDK的混淆配置腳本。
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.huawei.hianalytics.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
步驟 2:如果您使用了AndResGuard,需要在應用級的“build.gradle”文件中加入AndResGuard允許清單。
"R.string.hms*",
"R.string.connect_server_fail_prompt_toast",
"R.string.getting_message_fail_prompt_toast",
"R.string.no_available_network_prompt_toast",
"R.string.third_app_*",
"R.string.upsdk_*",
"R.layout.hms*",
"R.layout.upsdk_*",
"R.drawable.upsdk*",
"R.color.upsdk*",
"R.dimen.upsdk*",
"R.style.upsdk*",
"R.string.agc*"
5、添加權限
在調用材質生成能力時,開發者需要在AndroidManifest.xml文件中申請如下權限:
<!-- 允許程序寫入材質貼圖文件和讀取需要處理的數據 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 網絡權限 數據上傳和材質貼圖下載使用 -->
<uses-permission android:name="android.permission.INTERNET" />
在調用3D物體建模能力時,開發者需要在AndroidManifest.xml文件中申請如下權限:
<!-- 允許程序寫入模型文件和讀取需要處理的數據 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 網絡權限 數據上傳和模型下載使用 -->
<uses-permission android:name="android.permission.INTERNET" />
開發步驟
在開始API開發工作之前,完成開發准備工作同時請確保工程中已經配置配置HMS Core SDK的Maven倉地址,並且完成了本服務的SDK集成。
- 使用雲側服務的能力,需要使用“agconnect-services.json”里的api_key值,在應用初始化時通過api_key或者AccessToken來設置應用鑒權信息,AccessToken的優先級較高。
- (推薦)通過setAccessToken方法設置AccessToken,在應用啟動時初始化設置一次即可,無需多次設置。
MaterialGenApplication.getInstance().setAccessToken("your AccessToken");
從“ageonnect-services.json”中的api_key獲取Access Token可參見基於OAuth 2.0開放鑒權客戶端模式。
- 通過setApiKey方法設置api_key,在應用啟動時初始化設置一次即可,無需多次設置。
MaterialGenApplication.getInstance().setApiKey("your api_key");
在AppGallery Connect上注冊應用時,會給你的應用分配api_key。
- 新建材質生成引擎和材質生成配置器並初始化材質生成引擎。
// 新建材質生成引擎,傳入當前context。
Modeling3dTextureEngine engine = Modeling3dTextureEngine.getInstance(context);
// 新建材質生成配置器。
Modeling3dTextureSetting setting = new Modeling3dTextureSetting.Factory()
// 設置工作模式為AI模式。
.setTextureMode(Modeling3dTextureConstants.AlgorithmMode.AI)
.create();
- 新建偵聽器回調,用於處理材質生成上傳結果。
Modeling3dTextureUploadListener uploadListener = new Modeling3dTextureUploadListener() {
public void onResult(String taskId, Modeling3dTextureUploadResult result, Object ext) {
// 獲取材質生成上傳圖片結果。
if (result.isComplete()) {
// 上傳結果處理。
}
}
@Override
public void onError(String taskId, int errorCode, String message) {
// 上傳錯誤回調函數。
}
@Override
public void onUploadProgress(String taskId, double progress, Object ext) {
// 預留接口。
}
};
- 上傳采集圖片至雲側。
// 獲取材質生成任務ID,傳入配置器。
Modeling3dTextureInitResult modeling3dTextureInitResult = engine.initTask(setting);
String taskId = modeling3dTextureInitResult.getTaskId();
if (taskId == null || taskId.equals("")) {
Log.e("", "get taskId error " + modeling3dTextureInitResult.getRetMsg());
} else {
// 設置上傳監聽器。
engine.setTextureUploadListener(uploadListener);
// 異步上傳,傳入任務id和圖片文件所在文件夾路徑。
engine.asyncUploadFile(taskId, filePath);
}
- 查詢雲側材質生成進度。
// 新建材質生成任務處理實例,傳入當前context。
Modeling3dTextureTaskUtils taskUtils = Modeling3dTextureTaskUtils.getInstance(context);
// 查詢材質生成進度。
Modeling3dTextureQueryResult queryResult = taskUtils.queryTask(taskId);
- 新建偵聽器回調,用於處理材質生成下載結果。
Modeling3dTextureDownloadListener downloadListener = new Modeling3dTextureDownloadListener() {
public void onResult(String taskId, Modeling3dTextureDownloadResult result, Object ext) {
// 獲取材質生成下載貼圖結果通知。
if (result.isComplete()) {
// 下載結果處理。
}
}
@Override
public void onError(String taskId, int errorCode, String message) {
// 下載錯誤回調函數。
}
@Override
public void onDownloadProgress(String taskId, double progress, Object ext) {
// 預留接口。
}
};
- 下載材質生成貼圖。
// 設置下載監聽器。
engine.setTextureDownloadListener(downloadListener);
// 下載材質貼圖,傳入任務id和保存路徑。
engine.asyncDownloadTexture(taskId, savePath);
- 調用材質生成同步接口,可以實時獲取生成貼圖。
// 同步接口,傳入圖片文件路徑、保存貼圖路徑、配置器。
int result = engine.syncGenerateTexture(filePath, downloadPath, setting);
- 刪除材質生成任務。
int ret = taskUtils.deleteTask(taskId);
了解更多內容>>
解決集成問題請到Stack Overflow
關注我們,第一時間了解 HMS Core 最新技術資訊~
