使ったもの
- Unity 2019.4.31f1
- blender 2.83.20.0
UniGLTFは使いません。理由は後述。
まえがき
こんにちは。VRにドハマりしてる、きくはなと申します。
最近、テキストから3Dモデルを生成できるAI、Shap-Eで遊んでいます。
このShap-Eで遊ぶためには、Google Colabなどのpython環境でコードを動かす必要があるのですが、
hysts氏作成のデモサイトを使うことで、簡単に体験することができます。
上記のデモサイトで3Dモデルをダウンロードすると、glb形式で出力されます。
これをUniGLFTでインポートできるようにして、Unityで使ってみよう!
エラーが出て上手くインポートできませんでした...
原因がよく分からなかったので推測にはなりますが、UniGLFTは頂点カラーglbをそもそもサポートしていないのかもしれません。
というのも、まず前提として、Shap-Eが出力する3Dモデルは頂点カラーで着色がされています。
(ここら辺の原理はShap-Eの論文を読み込んでみると理解できるかと思います。興味があればぜひ。)
試したところ、テクスチャが存在するglbはインポートができたので、そういうものなのかもしれません。
ミノカサゴのフォトグラメトリモデルです。"UVセット0"がアクティブで、テクスチャデータが存在します。
気を取り直して、頂点カラーglbをUnityにもっていく方法を探してみます。
調査した結果、頂点カラーを表示するシェーダーを作成できることが分かりました。
さっそく試してみましょう!
1. blenderでglb->FBXの処理を行う。
とは言ったものの、glbをそのままUnityにインポートすることはできません。
頼みの綱のUniGLTF君には断られてしまったので、ここではblender君の力を借りましょう。
glbをインポートして、
FBXとしてエクスポートします。
はい、blenderくんの仕事はこれで終わりです。
一応、頂点カラーを画像テクスチャにベイクしたり、ポリゴン数を削減して軽量化を図ることも可能ではあるのですが、かなり面倒なので、今回は割愛したいと思います。
2. Unityにインポートする
FBXにしてしまえば、Unityにもっていくのは簡単です。
あとはシェーダーですが、こちらで紹介されていたものをそのまま使用させていただきました。
Shader "Custom/Shader_VertexColor" {
Properties {
}
SubShader {
Tags {
"Queue" = "Geometry"
"RenderType" = "Opaque"
}
CGPROGRAM
#pragma target 3.0
#pragma surface surf Standard fullforwardshadows
struct Input {
fixed4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutputStandard o) {
o.Albedo = IN.color.rgb;
}
ENDCG
}
FallBack "Diffuse"
}
このシェーダーをFBXに適用してあげると...
こうなります。
後ろのカービィちゃんは前述しためんどくさいやり方(画像テクスチャベイク・ポリゴン数削減済み)で実装したもので、画像テクスチャが存在しますが、VRHMDのモデルは画像テクスチャがなくとも着色されていることが分かるかと思います。
おわりに
以上が頂点カラーGLBをUnityにもっていく方法になります。
皆さんもShap-Eで3Dモデルを生成しまくって、Unityにもっていって遊んじゃいましょう!
参考