RVMATに関する解説

原題 : RVMAT
原文 : http://community.bistudio.com/wiki/ArmA:_RVMAT
翻訳時期 : 2008 Aug


Material theory(マテリアルのセオリー)

Lighting(ライティング)

ライティングとシェーディングは、3Dシーンを魅力的なものにします。リアルタイムレンダリングにおいて、エンジンが表現できるよう最もリアルに見えるサーフェイスをどのようしてシェーディングが作業するのか、製作者は簡単にでも理解に務めるべきでしょう。

ArmAのエンジンは、ライティングをT * (D.o + A) + S.oの計算式で行います。

T — テクスチャのカラー

D — 拡散光(カラー、明暗度、方向。エンジンは太陽または月のどちらかの光源による1方向のライティングになります)。Dは、最大が(L.N,0) *sunLightColorとして計算されます。Lは、光の方向、Nはサーフェイスの向く方向すなわち法線方向です。

A — 環境光(色と明暗度。雲量の設定値により全てのシーンで常に同じ明暗度で描写されます)

S — スペキュラー(マテリアル(質感)の光沢度と反射率)

O — 光の方向(1の場合はピクセルが輝き、0の場合は影になります)

面の向く方向(法線)でライティングを補間する1頂点あたりのライティングをシンプルなマテリアルが数えます。それはグラウンドシェーディングモデルとしてよく知られたと同種のものです。更に複雑なマテリアルは法線の方向あたりのピクセル数を使います。

シェーディング計算のための値は、テクスチャ、ビットマップ効果、エンジンのライト設定(コンフィグ)及びマテリアル設定(*.rvmat)を結合して行われます。

Shadows(シャドウ)

ArmAのエンジンでは2つタイプでシャドーが計算されます。1つめはビデオオプションの設定値によるもの、もうひとつはモデルに施された設定値です

ステンシルバッファシャドウはシャープに表現され、そしてシーン全体の描写の後に追加されます。このエンジンはステンシルシャドウボリュームで現れる拡散光値を減らします。この結果は、スペキュラーを影の中で描写することから確認できます。マテリアルに環境光と拡散光を設定する時も、同じ結果とならない、そしてForceDiffuse!=0のカラーは補正されません。

シャドウバッファーは、ビューボートからシーン全体にグラフィックカードが計算したソフトなシャドウマップを作り出します。これは正確な影が作り出す効果です。

Glossiness(光沢)

反射するマテリアルは、全ての角度においてどのくらいたくさんのライトが反射するのかと言われる曲線(二方向性な反射率の機能)によって定義されます。ArmAのエンジンにおいて、私達は*rvmatファイルに書かれたスペキュラーパワーまたはイレイディアンス(放射照度)テーブルの値を使用しています。

Sections(セクション)

テクスチャとマテリアルは面の上で互いに独立した状態でリンクしています。よって製作者は一枚のテクスチャによってマッピングされたサーフェイス上の様々なマテリアルを用いることが出来ます。

グラフィックカードが新しいパラメータの描写を命令される時はいつでも、私達はシーンセレクションを呼び出すことが出来ます。これはつまり新しいオブジェクト(*.p3d)やテクスチャ、マテリアルを描写する時のことです。無数の新しい三角よりもっと多いレンダリングで、このワークロードはGPUとCPUを遅くします


RVMATファイル

これらのファイルはコンフィグによって並び替えられます

Basic surface setting(基本的なサーフェイスの設定)

Ambient[]={0.9,0.9,0.9,1};

サーフェイスの色の組み合わせ値(カラーテクスチャ R,G,B,A)は、ライトのメインとなる方向によっては光らない。 Diffuse[]={0.9,0.9,0.9,1};

サーフェイスの色の組み合わせ値は、ライトの主たる方向によって光ります。

ForcedDiffuse[]={0,0,0,0};

これらの値は、トランスルーセンシー(透明、半透明)をシミュレートするよう補助します。拡散光のパートは、影のかかったサーフェイスでも反射します。これは環境光と似たようなものですが、ライティングのコンポーネントとは異なります。残念なことに、いくつかのシェーダーでは、 forcedDiffuseと一緒には動作しません。

Ambient[]={1,1,1,1};
Diffuse[]={0.5,0.5,0.5,1};
ForcedDiffuse[]={0.5,0.5,0.5,0}

このコンビネーションは、以前の頂点プロパティにあった”Half Light(半分の明るさ、サーフェイスは全ての側面から同じ明るさで、フラットに描写される)”と同じ結果になります。葉っぱの集まりのようなサーフェイスのため、この特殊なシェーダーが存在します。そしてforcedDiffuseのアルファ値設定としても使用され、光をどこまで通すのか(1.0の場合は、全てを透過)を計算します。

emmisive[]={0,0,0,0};

lsoと呼ばれるルミネッセンス(白熱によらない発光)。サーフェイス自身がどれだけ発光するかの明るさを与える量のことです。光源として使用します。自分で光っているようにアピールしますが、周辺を明るく照らすわけではありません。

specular[]={0.3,0.3,0.3,0};

ホットスポットと呼ばれるものを作ることに使われます (スペキュラーレベル+スペキュラーカラーの最大)。サーフェイスから反射されたライトのパートです。スペキュラーは、シェーダーで指定した頂点あたりまたはピクセルあたりによって計算されます 。

specularPower=40;

グロッシネス(光沢)とも呼ばれています。ホットスポットをどれだけシャープにするか定義します。いくつかのシェーダーは、この値の代わりにイレイディアンステーブルを使用します。

上記設定が意味する全ては、1ピクセルあたりが使用するビットマップの効果を計算したらどうなるか、というものです

全てのコンポーネントは、サーフェイスシェーディングの計算を用いることで一緒になります:

pixel RGB on screen(表示されるピクセルのRGBは) =
((RVMATのambient値 * RGB texture * Environment ambient)
+ (RVMATのdiffuse値 * RGB texture * Environment diffuse * 光の方向)
+ (RVMATのforced diffuse値 * RGB texture * Environment diffuse)
+ RVMATのemissive material値 * RGB texture
+ (RVMATのspecular値 * Environment diffuse * 光の方向)

色の値は通常は0から1の範囲で設定しますが、それ以上の場合もあります。ArmAのエンジンはHDRの中でライティングを計算し、その範囲は0から255のRGB深度です。モニターに表示される最終的なRGB値は、目視/照準の視点設定により各フレームが計算されていきます。

現実世界における表面は、入ってきた光を100%反射しているわけではありません。多くの光は、拡散なしに反射します。拡散光の合計値は、forced diffuse値と反射光は1(最大値)といった制限は受けないはずです。しかしArmAのリアルタイムなマテリアルにはあてはめられないので、日光のホットスポットとしてまた環境を照らす光のミスとして扱ってレンダリングするのです – こんな場合は、暗すぎるように見えることでしょう

拡散光はだいたいの場合、40%から80%がサーフェイスに使用されます。もし最高にリアリスティックなサーフェイス設定を実現したいのであれば、写真を参考に勉強してみてください。RVMATの設定は、テクスチャとリアリスティックなダイナミックレンジの最大値を改良した十分なカラーレンジと同じくらい可能なものを引き出すことができます。

現実世界の表面は、たいがい方向に沿って反射し、同じ方向に光がばら撒かれます – 拡散光(ディフューズ)と環境光(アンビエント)は等しいのです。ArmAのエンジンは、現実世界のライティング結果をベースとして、拡散光と環境光の環境設定値を再現しようとします。マテリアル設定のコントラスト補正とおりにはなりません。

拡散光の最低値は、やわらかいマテリアルで使用されます(いくつかの光は、forceDiffuseとして解釈されます)。環境光の最低値は、インテリアのような削減すべきグローバルアンビエントが掛かるサーフェイスを使用することが出来ます。通常は、アンビエントライトマップが作用します。

Specular color(スペキュラーのカラー、反射色)

通常、私達は自然なRGB色を使用します。しかし時として、RVMATの色合いが影響することもあります。照かった鉄の表面のようなスペキュラー(反射光)の設定は、一目瞭然なものとして挙げられます。

もし、スペキュラーを使用したいのであれば、私ならこう数えます:

X= B/(Sp*Db)

B.. ホットスポットとして表現したい色

Sp.. マテリアルにおける実際のスペキュラー設定

Db.. 環境におけるライティングの色(環境光と拡散光が時間や天候により変化した色) Buldozerをプレビューすることで、O2環境エディタは実際の色を使用します。

X ..スペキュラーを取得した要求色に組み合わせて使用したい数

Render flags(レンダーフラッグ)

OFP時代の頂点プロパティのライティング設定の代わりに、シェーディングプロパティを指定して使用するようになりました

renderFlags[] = {flag,flag};
  • NoZWrite
    Z-bufferのポリゴンを数えません。アルファ透過サーフェイスを次の人工的なシャドウを固定した他のポリゴンに被せるために使用(例えばSquadロゴ)
  • NoColorWrite
    カラーチャンネルの計算を無効にする。アルファとZ-bufferがあるポリゴンは計算されません。
  • NoAlphaWrite
    アルファチャンネルの計算を無効にする。マテリアルを2枚持った透過するガラス等に使われます
  • AddBlend
    背景に透過アルファを持ったサーフェイスを追加。ファイアパーティクル(爆発炎)などに使用します
  • LandShadow
    地形のため
  • AlphaTest32
    別個のアルファに消失する透過になるピクセルの出発点を定義。最大値は、使われたピクセル((Alphatest64, Alphatest128)
  • surfaceInfo=”data\wood.bisurf”;
    サーフェイスの物理設定ファイルにリンクする
  • mainLight
  • fogMode=FogAlpha
    フォグ(霧、埃)の振る舞いを設定。アルファチャンネルも修正することで消失するサーフェイス – 道路に使用します。

Always in Shadowは、(RVMATのdiffuse[]={0,0,0,0}) + (理に適ったスペキュラーの減少)の設定と一緒にアーカイブすることができます

Shader specific setting(シェーダーを指定する設定)

シェーダーを選択します

PixelShaderID=".....";
VertexShaderID=".....";

各シェーダーは、”Stages”を指定して使用します

 class StageX

各ステージは、シェーダーの計算用にパラメータを定義します。通常は、作用するビットマップにリンクする形で行います。

  • texture= (名称と作用させるビットマップテクスチャのパス)
  • Filter=”Anisotropic”; /// 異方性

デフォルトはAnisotropicです。しかしいくつかのシチュエーションでは、ポイント、ライナー、トライニアを使用することが出来ます。

  • uvSource=”tex”;
    設定可能値 : none, tex, tex1(2番目のUVセット)
  • class uvTransform
    オフセット、デフォームあるいはタイリングしたテクスチャに与えるUVセット

シェーダーリスト

ピクセルシェーダー:

Normal(ディフューズカラーの調整,アルファの重畳)
NormalDXTA(ディフューズカラーの調整,アルファの重畳,DXTalphaの訂正)
NormalMap(ノーマルマップのシェーダー)
NormalMapThrough(ノーマルマップのシェーダー-ライティングの通過)
NormalMapSpecularThrough(ノーマルマップのシェーダー-ライティングの通過)
NormalMapGrass(ノーマルマップのシェーダー-ライティングの通過)
NormalMapDiffuse
NormalMapDiffuseMacroAS
NormalMapMacroAS
NormalMapSpecularMap
NormalMapDetailSpecularMap(NormalMapDiffuseに類似)
NormalMapMacroASSpecularMap
NormalMapDetailMacroASSpecularMap
NormalMapSpecularDIMap(NormalMapSpecularMapと同等、ただし_SMDIテクスチャを使用する)
NormalMapDetailSpecularDIMap
NormalMapMacroASSpecularDIMap
NormalMapDetailMacroASSpecularDIMap
Detail(詳細テクスチャ)
Interpolation
Water(海面)
WaterSimple(小さな水面)
White
WhiteAlpha
AlphaShadow(シャドウアルファを記述)
AlphaNoShadow(影なしのシャドウアルファを記述)
Terrain
DetailMacroAS
Grass(草などのクラッターに落とすボリュウメトリック(容量)シャドウを許可する特殊なシェーダー)

バーテックスシェーダー:

Basic(拡張情報無し)
NormalMap(ノーマルマップ)
NormalMapDiffuse(ノーマルマップ+詳細マップ)
NormalMapDiffuseAS
BasicAlpha(プリバーテックス・アルファを基本)
NormalMapAS
NormalMapAlpha(プリバーテックス・アルファを伴ったノーマルマップ)
NormalMapDiffuseAlpha(ノーマルマップ+詳細マップ+プリバーテックス・アルファ)
ShadowVolume(シャドウボリューム)
Water(プリパーテックスの水面アニメーション)
WaterSimple(プリパーテックスの水面アニメーション(泡なし))
Sprite(パーティクルのエフェクト)
Point(アンチエイリアスのポイント)
NormalMapThrough(ノーマルマップ-シェーダーツリー)
NormalMapSpecularThrough(ノーマルマップ-シェーダーツリー)
TerrainAlpha(アルファマスクのある地形-VSNormalMapDiffuseAlphaに基づく)
Terrain(地形、アルファマスクなし-VSNormalMapDiffuseに基づく)
BasicAS(アンビエントシャドウ)
NormalMapThroughNoFade(ノーマルマップ-シェーダーツリー-ポリゴンのフェードなし)
NormalMapSpecularThroughNoFade(スペキュラー付きノーマルマップ-シェーダーツリー-ポリゴンのフェードなし)

すべての特定タイプのマテリアルは、固定された結合した頂点とステージ番号を固定したピクセルシェーダーとテクスチャのタイプを使用します。O2PE Materialエディタでマテリアルテンプレートを使用するか、またはBIモデルで*.rvmatファイルをチェックしてください。

サーフェイスの物理プロパティ

RVMATファイルは、物理プロパティを定義するのにジオメトリLODsも使用します(このアイデアは、異なるビジュアル描写のままの多くの異なるサーフェイスを定義した物理マテリアルを設定したものを使用できるようにしたいという背景があります) これは*.bisurfファイルへのリンクを介して行われます。

surfaceInfo="data\wood.bisurf";

*.bisurfの定義に含まれるもの

rough=0.1; /// 草
dust=0.1; /// 埃
bulletPenetrability=150; ///弾丸の貫通力
// 秒速1000メートルの弾丸が停止するまでに進む距離(単位:ミリメートル)。 ライナーの速度低下が計算されます
soundEnviron=Empty;
isWater=false;
thickness=10 // ArmAには実装されていません
density=2500 // 単位:kg/m3。ただしArmAエンジンでも、実際の計算結果はリアルではありません。

免責事項 : 個人的に訳した文書ですので、もし翻訳された文章により何らかの損害、不利益が発生したとしても、一切の責任は負いませんのでその点をご留意の上お読みください。また原文に記載されている権利に基づき、利用にあたっては非商用利用にのみに限定されていますのでご注意ください。