マテリアルの値を適当に取得はしているが、使っているのはAI_MATKEY_TEXTURE_DIFFUSEのみ。
DirectX12の魔導書に書いてある通り、Diffuse、Specular、Toonのテクスチャはマテリアルにあろうが、無かろうが用意して、シェーダは常にそれらをサンプリングしている。
この形がいいのかよくわからないけど、よくよく調べてみるとあらゆる項目に対してテクスチャを用意できるみたいなので、項目を増やすとこの実装はまずい気がする。
そもそも適当に決めた読み込むパラメータの見直しと、読み込んだパラメータをシェーダに反映させるように作り直したい。
読み込むパラメータの見直し
現状読み込んでいるのは、テクスチャが以下。
AI_MATKEY_TEXTURE_DIFFUSE
AI_MATKEY_TEXTURE_SPECULAR
各種色、パラメータが以下。
AI_MATKEY_COLOR_AMBIENT
AI_MATKEY_COLOR_DIFFUSE
AI_MATKEY_COLOR_SPECULAR
パラメータにはこの他に下記が定義されてた。
AI_MATKEY_SHININESS_STRENGTH
AI_MATKEY_SHININESS
AI_MATKEY_COLOR_EMISSIVE
AI_MATKEY_COLOR_TRANSPARENT
AI_MATKEY_COLOR_REFLECTIVE
AI_MATKEY_OPACITY
AI_MATKEY_REFLECTIVITY
AI_MATKEY_REFRACTI
Blenderで定義を変えてExportして、どこと紐づくのかを調べてみた。
![]() |
| Blenderのマテリアル |
AI_MATKEY_COLOR_DIFFUSE
Blenderのラベルは「ベースカラー」
Blender側は色指定で、その値がそのまま渡る。
テクスチャを設定した場合は、AI_MATKEY_TEXTURE_DIFFUSEにファイルが設定され、カラーは0.8がRGBに返る。
AI_MATKEY_COLOR_SPECULAR
Blenderのラベルは「スペキュラー」
Blender側はスカラー指定で、受け取りはカラー。
各要素はDIFFUSEのRGB×スペキュラー値×0.5になっていた。
スペキュラー値が0なら0、0.5なら1/4、1なら1/2、2ならDIFFUSEと同じ値が返る。
テクスチャを設定した場合は、AI_MATKEY_TEXTURE_SPECULARにファイルが設定され、カラーは0.2がRGBに返る。
AI_MATKEY_SHININESS_STRENGTH
AI_MATKEY_SHININESS
Blenderのラベルは「粗さ」
どうやら、AI_MATKEY_SHININESS_STRENGTHとAI_MATKEY_SHININESSは同じ値が設定されているようだ。
Blender側はスカラー指定で、受け取りもスカラー。
設定値とは別の値が返る。
![]() |
| 粗さとShininessの関係 |
基本的にはBlenderで0~1の範囲で設定して、Assimpでは100~0の値が受け取れるので、0.01を掛けて1~0に変換して使う。
AI_MATKEY_COLOR_EMISSIVE
Blenderのラベルは「放射」と「放射の強さ」
Blender側はカラーとスカラー指定で、受け取りはカラー。
単純に放射の色に、放射の強さを掛けた値が返る。
テクスチャを設定した場合は、AI_MATKEY_TEXTURE_EMISSIVEにファイルが設定され、カラーは未設定になる。
AI_MATKEY_OPACITY
Blenderのラベルは「アルファ」
Blender側はスカラー指定で、受け取りはスカラー。
ちなみにテクスチャを指定してもAI_MATKEY_TEXTURE_OPACITYには設定されていなかった。
AI_MATKEY_COLOR_AMBIENT
AI_MATKEY_COLOR_TRANSPARENT
AI_MATKEY_COLOR_REFLECTIVE
AI_MATKEY_REFLECTIVITY
AI_MATKEY_REFRACTI
これらの値は紐づけがわからず。
Ambientは値自体は取得できて、常に0のカラーが返る。
ほかは設定されていない。
使ってるBlenderのバージョンは3.2、Assimpのバージョンは4.1で、最新のAssimpのヘッダを見るとかなり項目が増えていた。
Blenderのラベルと同じもの(メタリック、シーン、クリアコートなど)も用意されている。
Assimpのバージョンを上げると取れる項目は増えるのだろうか?
PBR
HLSLの魔導書に物理ベースレンダリングについて書かれていて、それを取り入れたいと思っているんだけど、この本のサンプルを見ても結果が不自然。
仕方がないのでネットで探してみると、Unityのシェーダが見つかったのでそれを参考に作ってみた。
マテリアルについてなんとなくわかってきたので、Blenderでパラメータかテクスチャを設定する方法を用意するつもりだけど、シェーダに指定するテクスチャの数を抑えるため1テクスチャにマージして、metalic(R)、roughness(G)、emissive(B)、未定(A)のようにする。
パラメータを使う場合は下記。
metallic
blender:スペキュラー
assimp:AI_MATKEY_COLOR_SPECULARでRGBの最大値。
roughness
blender:粗さ
assimp:AI_MATKEY_COLOR_SHININESS。
emissive
blender:放射と放射の強さ
assimp:AI_MATKEY_COLOR_EMISSIVEでRGBの最大値。
「スペキュラー」も「放射」もBlender上、色を設定するパラメータだけど、テクスチャで指定する方との互換性でスカラー値にする。スペキュラーは計算上メタリック扱いで、放射はアルベドカラーをそのまま光らせる方針。
テクスチャのマージ
モノクロのテクスチャをそれぞれ用意して、metalic(R)、roughness(G)、emissive(B)、未定(A)に割り当てて出力する。
![]() |
| emissive |
出力結果
![]() |
| Emissiveなし |
![]() |
| Emissiveあり |
右の列がMetallicが高いオブジェクトで、上段と下段はパラメータで全体に指定、中段はテクスチャで枠だけ指定。
中央の列がMetallicが低いオブジェクトで、上段と下段はベースカラーに赤を指定、中段はテクスチャを指定。
左の列はEmissiveが指定してあるオブジェクトで、上段と下段はパラメータで全体に指定、中段はテクスチャで前面のみ光るように指定。

















































