Kenshi
評價次數不足
MODガイド テクスチャ&メッシュ仕様
由 Lucius 發表
Kenshiのテクスチャとメッシュについて解説します。
   
獎勵
加入最愛
已加入最愛
移除最愛
Kenshiのテクスチャについて
Kenshiで使用可能なテスクチャをざっくりと説明します。

  • ベースカラー
    • マテリアルの色です。

  • Glossiness
    • 表面の粗さを制御し、値が高いほど表面がつるつるになります。
      逆に値が低いほど表面がつるつるになるのをRoughnessと言いますが、そちらの方が一般的です。

    • GlossinessとRoughnessは階調反転で相互変換可能です。
      KenshiはシェーダーでGlossinessをRoughnessに変換しています。

    • texture mapのアルファチャンネルを使用します。

  • Metallic (Metalness)
    • 金属にするかを制御します。

    • 武器や建物はmetalness mapの赤チャンネルを使用します。

    • 防具とバックパック、義肢はcolor mapの青チャンネルを使用します。
      ただし、フィールドに配置された場合はアイテム扱いになるため、metalness mapの赤チャンネルを使用します。

  • ノーマルマップ
    • 法線ベクトルを制御します。

    • いくつか種類があり、主にオブジェクト空間とタンジェント空間に分類され、更にDirectX形式とOpenGL形式に細分類されます。

    • Kenshiでは以下を使用します。
      • タンジェント空間&DirectX形式
        下記以外

      • タンジェント空間&OpenGL形式
        防具とバックパック、義肢、動物

    • OpenGL形式とDirectX形式は緑チャンネルの階調反転で相互変換可能です。
      KenshiはDirectXを使うので、シェーダーでOpenGL形式をDirectX形式に変換しています。

    • 透過をノーマルマップのアルファチャンネルに割り当てていますが、実質的にアルファクリッピング専用です。
各オブジェクトタイプにおけるテスクチャの用途について
Kenshiのシェーダーはテスクチャの使い方が統一されておらず、キャラクターや武器、防具等で仕様が異なっています。


以下は個別の補足になります。
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に応じてキャラクターモデルを部分的に非表示にできます。

有効な色
以下の色がPart Mapに使用可能です。
  • White (#FFFFFF)
  • Red (#FF0000)
  • Green (#00FF00)
  • Blue (#0000FF)
  • Yellow (#FFFF00)
  • Magenta (#FF00FF)
  • Cyan (#00FFFF)
  • Orange (#FF8000)
  • Purple (#8000FF)
  • Teal (#008080)
※Tealを設定するにはfcs_enum.defの改変が必要です。

注意点
  • 頂点単位で非表示にします。色分けはメッシュのトポロジーを考慮した方が綺麗になります。
    また、非表示箇所をしっかりと分けるには、中間の頂点を黒にします。
    (理由はBlenderで頂点を非表示にしてみればわかると思います)

  • Part MapはBlenderで画像テクスチャの端の処理を「延長」にするのと同じ挙動になります。
    したがって、テクスチャ最上部が有効な色になっていると頭部が巻き込まれてしまいます。
    Community Part Mapはハイブでやらかしています。
    逆に言うと、テクスチャ最上部を有効な色にすれば頭部を非表示にできます。

  • テクスチャサイズは
    • 全ての頂点を塗り分け可能
    • 最上部1ピクセルに頂点が存在しない
    以上の条件を満していれば十分です。
    大抵は256×256か512×512になると思います。
DXT5nmを青紫のノーマルマップに変換する方法
Blenderのベイク機能を使って変換する方法を紹介します。

例としてハイブのノーマルマップを変換します。

  1. Blenderを起動します。

  2. 追加 > メッシュ > 平面を選択します。

  3. マテリアルを設定し、シェーダーエディターで画像テクスチャを追加します。

  4. 「stick_people_body_normal.dds」を開きます。

  5. ノード使って青を復元します。



    ノードが多いので分かりにくいですが、以下のことをしています。
    1. 画像テクスチャの色空間を「非カラー」

    2. カラー分離で緑を抽出

    3. 色をベクトルの成分に変換
      2倍して1を引きます。
      色が0~1の範囲に対してベクトルが-1~1になるからです。

    4. 数式ノードで「sqrt(1 - x*x - y*y)」を計算
      「アルファと緑を2乗→アルファと緑を加算→1から減算→平方根」で求めます。

    5. ベクトルの成分を色に変換
      0.5倍して0.5を足します。

    6. 緑をOpenGL形式に変換
      1から引きます。この処理はカラー分離ノードの方をつなげます。
      動物のノーマルマップは変換不要です。

    7. カラー合成

  6. カラー合成後の色を使ってノーマルマップを適用します。



  7. ベイク用の画像テクスチャノードを追加し、ベイク用の画像を作成します。

  8. ベイクの準備をします。



    • レンダーエンジンは「Cycles」
    • デバイスは「GPU演算」
    • ベイクタイプは「ノーマル」
    • スペースは「タンジェント」
    • DirectX形式にしたい場合はシズルGを「-Y」

  9. ベイク用の画像テクスチャノードを選択してアクティブにしてからベイクを実行します。
    画像のような色合いになっていれば成功です。

DDSの圧縮形式
DDS(DirectDraw Surface)は様々な圧縮形式が存在していますが、Kenshiは以下の圧縮形式が利用可能です。

  • 無圧縮
  • BC1 (DXT1)
  • BC2 (DXT3)
  • BC3 (DXT5)
  • BC6H ※HDR用
  • BC7
sRGBは使用できません。


BC6H以外の利点と欠点、使いどころを説明します。


無圧縮
メリット
全く劣化しないので、一番綺麗に映ります。

デメリット
綺麗とは言いましたが、見た目とVRAM使用量が釣り合いません。(サイズがBC5やBC7の4倍)
しかもオプションのテクスチャ設定を無視して常に最高画質で描画します。

用途
パフォーマンスの観点で言うと、使いどころは全くありません。
これを使うぐらいなら後述のBC7を使った方がいいです。


BC1 (DXT1)
メリット
圧縮率が高く、RGBと比較して1/6、RGBAと比較して1/8になります。

デメリット
アルファチャンネルが1bitしかありません。
また、色調によっては大きく劣化して見えます。
以下の対策方法があります。
  • 4×4ピクセル内で色調が大きく変わらないようにする
  • 劣化が目立ちやすい暗色を避ける

用途
アルファが不要、または0%か100%で塗り分けできるテスクチャに最適です。
バニラはノーマルマップやカラーマップをBC1で圧縮しています。


BC2 (DXT3)、BC3 (DXT5)
メリット
アルファチャンネルが使用可能です。
基本的にBC3を使い、アルファの劣化ノイズに問題があればBC2を試します。

デメリット
BC1と同様に色調によっては大きく劣化して見えます。
対策方法も同様です。

用途
glossiness等を使うテスクチャに最適です。


BC7
メリット
BC3と同じ圧縮率(RGBAと比較して1/4)で、RGBチャンネルのブロックノイズが目立ちにくいです。

デメリット
オプションのテクスチャ設定を無視して常に最高画質で描画します。
(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)

ゲーム生成時のサイズについて
以下を満たす最小の自然数nを適用した値が横幅になります。縦幅も同様に求められます。
50 * inventory footprint width < pow(2, n)


カメラ設定
位置は原点、回転はXのみ90度


カメラの視野角
  • アイコンが正方形または縦長の場合
    水平画角を45度にします。


  • 横長の場合
    垂直画角を45度にします。センサーフィットを垂直にすると垂直画角になります。


3Dモデル設定
以下のように対応しています。
  • 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のレンダリング画像とゲーム内生成画像の比較
野太刀



サムライの鎧


※Blender側の画像は自動生成の画像と同じになるように拡縮済み