MODガイド テクスチャ&メッシュ仕様
Kenshiのテクスチャについて
Kenshiで使用可能なテスクチャをざっくりと説明します。
- ベースカラー
- マテリアルの色です。
- Glossiness
- 表面の粗さを制御し、値が高いほど表面がつるつるになります。
逆に値が低いほど表面がつるつるになるのをRoughnessと言いますが、そちらの方が一般的です。 - GlossinessとRoughnessは階調反転で相互変換可能です。
KenshiはシェーダーでGlossinessをRoughnessに変換しています。 - texture mapのアルファチャンネルを使用します。
- 表面の粗さを制御し、値が高いほど表面がつるつるになります。
- Metallic (Metalness)
- 金属にするかを制御します。
- 武器や建物はmetalness mapの赤チャンネルを使用します。
- 防具とバックパック、義肢はcolor mapの青チャンネルを使用します。
ただし、フィールドに配置された場合はアイテム扱いになるため、metalness mapの赤チャンネルを使用します。
- ノーマルマップ
- 法線ベクトルを制御します。
- いくつか種類があり、主にオブジェクト空間とタンジェント空間に分類され、更にDirectX形式とOpenGL形式に細分類されます。
- Kenshiでは以下を使用します。
- タンジェント空間&DirectX形式
下記以外 - タンジェント空間&OpenGL形式
防具とバックパック、義肢、動物
- タンジェント空間&DirectX形式
- OpenGL形式とDirectX形式は緑チャンネルの階調反転で相互変換可能です。
KenshiはDirectXを使うので、シェーダーでOpenGL形式をDirectX形式に変換しています。 - 透過をノーマルマップのアルファチャンネルに割り当てていますが、実質的にアルファクリッピング専用です。
各オブジェクトタイプにおけるテスクチャの用途について
Weapon, Crossbow
- シェーダーが頂点カラーとアルファクリッピングに対応していません。
Armor, RobotLimb, Backpack
- color mapは染色しないと効果が出ないので、Metalnessのみ使用したい場合は、FCSで装備に固有カラーを設定します。
- 義肢にcolorを設定するにはfcs.defの改変が必要です。
Item
- FCS上は防具等と同じマテリアルデータを使用しますが、武器や建物と同系統のシェーダーを使うのでcolor mapは使えません。
- metalnessを設定するにはfcs.defの改変が必要です。
Building
- L型ハウス等は頂点カラーを使っているので、テクスチャの改変に加えて3Dモデルの改変も必要です。
- FCSでmaterial typeをDUALにすると異なる2つのテクスチャが使用可能になります。
しかし、3Dモデルに頂点カラーがないと建築途中のテクスチャを使ったレンダリングで毎フレームエラーログを吐き、最悪CTDになります。
CTDにならなくても、kenshi.logが数秒で数百MBにまで肥大化します。特に、MODでよく再利用される「furniture_atlas_modular」はDUALになっています。頂点カラーのエクスポートを忘れないようにしましょう。
Vest (シャツ)
- シェーダーの仕様によりノーマルマップが必須です。
- color mapは赤チャンネル(第一カラー)しか使えません。
- 人型キャラクターのシェーダーで処理するので、ノーマルマップはDirectX形式です。
Character
- ノーマルマップが他と異なりDXT5nmという形式を使います。
タンジェント空間のノーマルマップの緑チャンネルを赤緑青チャンネルに割り当て、赤チャンネルをアルファチャンネルに割り当てます。
消滅した青チャンネルはシェーダーで以下の計算式を使って復元します。z = sqrt(1 - x*x - y*y)
※sqrtは正の平方根を返す関数法線ベクトルが単位ベクトルであるのと、タンジェント空間なら普通は法線をポリゴンの内向きにしない(zが非負である)ので上記の式が成立します。
Hair, Beard
- キャラメイクでベースカラーを指定するため、テクスチャにベースカラーを持たせられません。
Part Map
- Part Mapはキャラクターモデルの特殊なプロパティマップです。
防具のhide partに応じてキャラクターモデルを部分的に非表示にできます。
- White (#FFFFFF)
- Red (#FF0000)
- Green (#00FF00)
- Blue (#0000FF)
- Yellow (#FFFF00)
- Magenta (#FF00FF)
- Cyan (#00FFFF)
- Orange (#FF8000)
- Purple (#8000FF)
- Teal (#008080)
- 頂点単位で非表示にします。色分けはメッシュのトポロジーを考慮した方が綺麗になります。
また、非表示箇所をしっかりと分けるには、中間の頂点を黒にします。
(理由はBlenderで頂点を非表示にしてみればわかると思います) - Part MapはBlenderで画像テクスチャの端の処理を「延長」にするのと同じ挙動になります。
したがって、テクスチャ最上部が有効な色になっていると頭部が巻き込まれてしまいます。
Community Part Mapはハイブでやらかしています。
逆に言うと、テクスチャ最上部を有効な色にすれば頭部を非表示にできます。 - テクスチャサイズは
- 全ての頂点を塗り分け可能
- 最上部1ピクセルに頂点が存在しない
大抵は256×256か512×512になると思います。 - 全ての頂点を塗り分け可能
DXT5nmを青紫のノーマルマップに変換する方法
Blenderのベイク機能を使って変換する方法を紹介します。
例としてハイブのノーマルマップを変換します。
- Blenderを起動します。
- 追加 > メッシュ > 平面を選択します。
- マテリアルを設定し、シェーダーエディターで画像テクスチャを追加します。
- 「stick_people_body_normal.dds」を開きます。
- ノード使って青を復元します。
ノードが多いので分かりにくいですが、以下のことをしています。
- 画像テクスチャの色空間を「非カラー」
- カラー分離で緑を抽出
- 色をベクトルの成分に変換
2倍して1を引きます。
色が0~1の範囲に対してベクトルが-1~1になるからです。 - 数式ノードで「sqrt(1 - x*x - y*y)」を計算
「アルファと緑を2乗→アルファと緑を加算→1から減算→平方根」で求めます。 - ベクトルの成分を色に変換
0.5倍して0.5を足します。 - 緑をOpenGL形式に変換
1から引きます。この処理はカラー分離ノードの方をつなげます。
動物のノーマルマップは変換不要です。 - カラー合成
- カラー合成後の色を使ってノーマルマップを適用します。
- ベイク用の画像テクスチャノードを追加し、ベイク用の画像を作成します。
- ベイクの準備をします。
- レンダーエンジンは「Cycles」
- デバイスは「GPU演算」
- ベイクタイプは「ノーマル」
- スペースは「タンジェント」
- DirectX形式にしたい場合はシズルGを「-Y」
- レンダーエンジンは「Cycles」
- ベイク用の画像テクスチャノードを選択してアクティブにしてからベイクを実行します。
画像のような色合いになっていれば成功です。
DDSの圧縮形式
DDS(DirectDraw Surface)は様々な圧縮形式が存在していますが、Kenshiは以下の圧縮形式が利用可能です。
- 無圧縮
- BC1 (DXT1)
- BC2 (DXT3)
- BC3 (DXT5)
- BC6H ※HDR用
- BC7
BC6H以外の利点と欠点、使いどころを説明します。
しかもオプションのテクスチャ設定を無視して常に最高画質で描画します。
これを使うぐらいなら後述のBC7を使った方がいいです。
また、色調によっては大きく劣化して見えます。
以下の対策方法があります。
- 4×4ピクセル内で色調が大きく変わらないようにする
- 劣化が目立ちやすい暗色を避ける
バニラはノーマルマップやカラーマップをBC1で圧縮しています。
基本的にBC3を使い、アルファの劣化ノイズに問題があればBC2を試します。
対策方法も同様です。
(DDSのヘッダーにDXTがないと設定が無効になるようです)
しかしながら、画質を下げてプレイする人もいるので、一般公開するMODにはお勧めしません。
各オブジェクトタイプにおける頂点データの設定
キャラクターや防具はbinormalが必須であることはよく知られていますが、武器や建物はbinormalが無効でbitangent sign(binormalの符号)が必須であることはあまり知られていないみたいです。
bitangent signは反転したUVの補正に使うので、これが欠落している3DモデルはUV反転箇所の法線Y成分が逆になります。ちなみにバニラも要塞門IVやサーベルなどが欠落しています。
また、公式のBlenderアドオンはExport Binormalsにチェックを付けるとbitangent signを出力できないので気を付けてください。
Blenderで自動アイコン生成の設定を調整する方法
Blenderで調整した結果をFCSに反映する方法を解説します。
横長かどうかでこの後の設定内容が変わります。
画像のアスペクト比が「inventory footprint width : inventory footprint height」であればピクセル数は任意で大丈夫です。
設定例:野太刀(inventory footprint width = 10, inventory footprint height = 1)
50 * inventory footprint width < pow(2, n)
- icon offset H = 位置X
- icon offset V = 位置Z
- icon zoom = 位置Y / 5
- icon offset pitch = 回転X
- icon offset roll = -1 * 回転Y
- icon offset yaw = 回転Z + 90
WEAPONは回転が固定です。Blender上は以下の通りです。
回転X = 90
回転Y = 0
回転Z = 90
例:野太刀の設定値をBlenderに反映
例:サムライの鎧の設定値をBlenderに反映
※Blender側の画像は自動生成の画像と同じになるように拡縮済み
This guide was created by its original author on the Steam Community. Are you the author and want it removed? Request removal.