18.エフェクト開発

18.1 MME互換機能

MMMはMikuMikuEffect(以下MME)の互換機能を備えています。

MMEがサポートするアノテーションはほぼ対応していますが、細かい部分や動作は必ずしも一致しません。

以降、MME互換アノテーションを含めた機能について説明しています。

完全にMMM独自のものには「★」、一部MMMで扱いが異なる機能については「☆」マークを記載しています。

MMEにもある同様の機能についてはマークなしで記載しています。

また、かなりの部分が舞力介入PさんのMME REFERENCEと重複しています。ご了承ください。

18.2 エフェクトファイルについて

MMMのエフェクトファイルの拡張子は「.fxm」です。

MMEエフェクト拡張子「.fx」も読み込むことができます。

またエフェクトファイルに記述するテクニックやパス、変数の扱い、構文はHLSL仕様に準拠したものとなります。

ここにMMM(またはMME)で定義されたセマンティクスやアノテーションを追加することにより、独自の処理を行うことができます。

■ セマンティクスとは

セマンティクスとは、パラメータに紐付けられた識別子のことです。

下の例では、4x4の行列 WorldViewProjMatrix 変数に「WORLDVIEWPROJECTION」というセマンティクスが設定されています。

float4x4 WorldViewProjMatrix : WORLDVIEWPROJECTION;

定義されているセマンティクスをつけると、その変数にMMMから特定の値が渡されます。

この例では、処理中モデルのWorldViewProjection行列の値が渡されます。

■ アノテーションとは

アノテーションとは、テクニックやパス、パラメータにユーザーが独自に設定可能なデータのことです。

アノテーションの宣言は山型鍵括弧<>を使用します。

technique EdgeTec < string MMDPass = "edge"; > {

pass DrawEdge {

VertexShader = compile vs_2_0 Edge_VS();

PixelShader = compile ps_2_0 Edge_PS();

}

}

この例では、文字列型のMMDPassという変数に「edge」という値を設定しています。

18.3 ★ #define MIKUMIKUMOVING

MMMで読み込まれたエフェクトファイルには、"MIKUMIKUMOVING"が必ず定義されます。

これを ifdef 等を使用して処理を分岐させ、MME用とMMM用エフェクトを1つのファイルに混在させることも可能です。

#ifdef MIKUMIKUMOVING

(MMM用処理)

#else

(MME用処理)

#endif

18.4 ☆テクニック

テクニックには、以下のアノテーションを使用可能です。

アノテーション

string Subset

そのテクニックを適用する材質番号を指定します。

アノテーション省略時には、すべての材質が適用対象となります。

カンマ区切りでの指定や、ハイフンによる範囲指定も可能です。

technique Tech1 < string Subset = "0-4,6,8"; > {

...

}

☆ string MMDPass

そのテクニックを適用する描画対象を指定します。

指定可能な描画対象は下記の通りです。

    • "object"

    • "object_ss"

    • "shadow"

    • "edge"

"object_ss"の使用は非推奨です。後述の bool UseSelfShadow アノテーションを使用することをお奨めします。

technique Tech1 < string MMDPass = "object"; > {

...

}

bool UseTexture

そのテクニックがテクスチャを使用している材質のみを対象とする場合に「true」、使用していない材質のみを対象とする場合に「false」を指定します。

アノテーション省略時には、テクスチャの有無に関係なくテクニックが適用されます。

technique Tech1 < string MMDPass = "object"; bool UseTexture = true;> {

...

}

bool UseSphereMap

そのテクニックがスフィアマップを使用している材質のみを対象とする場合に「true」、使用していない材質のみを対象とする場合に「false」を指定します。

アノテーション省略時には、スフィアマップの有無に関係なくテクニックが適用されます。

technique Tech1 < string MMDPass = "object"; bool UseSphereMap = true;> {

...

}

bool UseToon

そのテクニックがモデルのみを対象とする場合に「true」、アクセサリのみを対象とする場合に「false」を指定します。

アノテーション省略時には、モデル、アクセサリ関係なくテクニックが適用されます。

technique Tech1 < string MMDPass = "object"; bool UseToon = true;> {

...

}

★ bool UseSelfShadow

そのテクニックがセルフシャドウを使用している材質のみを対象とする場合に「true」、使用していない材質のみを対象とする場合に「false」を指定します。

アノテーション省略時には、セルフシャドウの使用に関係なくテクニックが適用されます。

technique Tech1 < string MMDPass = "object"; bool UseSelfShadow = true;> {

...

}

18.5 ☆ジオメトリ変換

エフェクト内で使用するパラメータ(変数)に、以下に説明するセマンティクスやアノテーションを宣言することにより、

座標変換に使用する4x4の行列を取得することができます。

取得できる行列の種類は以下の通りです。

型はfloat4x4 であり、各セマンティクスの末尾に"INVERSE"を付けると、その行列の逆行列を取得できます。

また、"TRANSPOSE"を付けると、転置行列を取得することができます。

逆行列の転置行列を取得するには、"INVERSETRANSPOSE"を付けてください。

float4x4 WorldViewProjMatrix : WORLDVIEWPROJECTION;

float4x4 ViewInvMatrix : VIEWINVERSE;

★更に、MMMではライトが3つまで使用可能です。

後述の string Object アノテーションによりライト0-2の行列を取得したい場合は、セマンティクスの後ろに番号を入れます。

なお、番号なしはライト0と同義となります。

これはアノテーションobject="Light"のみ有効です。object="Camera"ではすべて同じ値が与えられます。

float4x4 WorldViewProjMatrix : WORLDVIEWPROJECTION0 < string Object = "Light"; >;

float4x4 ViewInvMatrix : VIEW0INVERSE < string Object = "Light"; >;

★また、3つのライトのWVP行列を配列で取得することも可能です。

セマンティクス

LIGHTWVPMATRICES

float4x4 の配列

ライトのワールド変換行列 x ビュー変換行列 x プロジェクション変換行列

配列長、つまりライトの数は変数 MMM_LightCount で渡されます(現在は必ず"3"となります)。

float4x4 LightWVPMatrices[MMM_LightCount] : LIGHTWVPMATRICES;

アノテーション

string Object

ビュー変換およびプロジェクション変換行列において、どこを視点とするかを指定します。

下記2つを指定可能です。

    • "Camera"

    • "Light"

float4x4 LightViewMatrix : VIEW < string Object = "Light"; > ;

18.6 ☆ライトとマテリアル

☆色値

マテリアル(材質)の色およびライトの色を取得することができます。

取得できる値の種類は以下の通りです。

型に float3 を指定するとアルファ値が省略されます。

float4 MaterialDiffuse : DIFFUSE < string Object = "Geometry"; >;

float3 MaterialAmbient : AMBIENT < string Object = "Geometry"; >;

★更に、MMMではライトが3つまで使用可能です。

後述の string Object アノテーションによりライト0-2の色を取得したい場合は、セマンティクスの後ろに番号を入れます。

なお、番号なしはライト0と同義となります。

これはアノテーションobject="Light"のみ有効です。object="Camera"ではすべて同じ値が与えられます。

float4x4 LightDiffuse : DIFFUSE0 < string Object = "Light"; >;

★また、3つのライト色を配列で取得することも可能です。

配列長、つまりライトの数は変数 MMM_LightCount で渡されます(現在は必ず"3"となります)。

float3 LightDiffuses[MMM_LightCount] : LIGHTDIFFUSECOLORS;

float3 LightAmbients[MMM_LightCount] : LIGHTAMBIENTCOLORS;

float3 LightSpeculars[MMM_LightCount] : LIGHTSPECULARCOLORS;

アノテーション

string Object

ビュー変換およびプロジェクション変換行列において、どこを視点とするかを指定します。

下記2つを指定可能です。

    • "Camera"

    • "Light"

☆位置と方向

ライトまたはカメラのワールド空間内における位置および向きを取得することができます。

取得できる値の種類は以下の通りです。

float3 LightDirection : DIRECTION < string Object = "Light"; >;

float3 CameraPosition : POSITION < string Object = "Camera"; >;

★更に、MMMではライトが3つまで使用可能です。

後述の string Object アノテーションによりライト0-2の色を取得したい場合は、セマンティクスの後ろに番号を入れます。

なお、番号なしはライト0と同義となります。

これはアノテーションobject="Light"のみ有効です。object="Camera"ではすべて同じ値が与えられます。

float3 LightDirection : DIRECTION0 < string Object = "Light"; >;

★また、3つのライトの位置または向きを配列で取得することも可能です。

配列長、つまりライトの数は変数 MMM_LightCount で渡されます(現在は必ず"3"となります)。

float3 LightDirection[MMM_LightCount] : LIGHTDIRECTIONS; // 方向

float3 LightPositions[MMM_LightCount] : LIGHTPOSITIONS; // ライト位置

アノテーション

string Object

ビュー変換およびプロジェクション変換行列において、どこを視点とするかを指定します。

下記2つを指定可能です。

    • "Camera"

    • "Light"

★ライトに関するその他の値

どのライトが現在有効であるか、また遠クリップ面距離などを取得することができます。

配列長、つまりライトの数は変数 MMM_LightCount で渡されます(現在は必ず"3"となります)。

bool LightEnables[MMM_LightCount] : LIGHTENABLES; // 有効フラグ

float LightZFars[MMM_LightCount] : LIGHTZFARS; // ライトzFar値

アノテーション

なし

マテリアル

マテリアル(材質)に設定されているテクスチャを取得することができます。

texture ObjectTexture: MATERIALTEXTURE;

sampler ObjTexSampler = sampler_state {

texture = <ObjectTexture>;

MINFILTER = LINEAR;

MAGFILTER = LINEAR;

};

アノテーション

なし

18.7 スクリーン情報

レンダリングターゲットのスクリーンサイズを取得することができます。

セマンティクス

VIEWPORTPIXELSIZE

float2

レンダリングターゲットのスクリーンサイズ

float2 ScreenSize : VIEWPORTPIXELSIZE;

アノテーション

なし

18.8 時間

時間に関する情報を取得することができます。

float ftime : TIME <bool SyncInEditMode=true;>;

アノテーション

bool SyncInEditMode (省略可能)

編集モード中でもフレームと連動するかどうかを指定します。

デフォルトは false です。

このアノテーションに false が指定されると、編集モード中でもTIMEおよびELAPSEDTIMEの値には、

フレーム時間ではなく実時間(システム時間)が使用されます。

18.9 マウス

マウス位置

マウス操作に関する情報を取得することができます。

セマンティクス

MOUSEPOSITION

float2

マウスの現在位置

スクリーンの中心を(0,0)として、左下隅が(-1.0,-1.0)、右上隅が(1.0,1.0)になります。

float2 pos : MOUSEPOSITION;

アノテーション

なし

マウスボタン

取得される型 float4 であり、その4つの float には下記の値が渡されます。

    • 最後にボタンが押されたときのマウスの座標(x, y)

    • 現在ボタンが押されているか (0 or 1)

    • 最後にボタンが押されたときのTIME値(秒)

マウスの座標の取り方は、MOUSEPOSITIONと同じです。

float4 mouse_down : LEFTMOUSEDOWN;

static float2 pos = mouse_down.xy;

static bool is_pressed = (mouse_down.z != 0);

アノテーション

なし

18.10 コントロールオブジェクト

指定したオブジェクトの様々な情報を取得します。

セマンティクス

CONTROLOBJECT

*下記

*下記

指定したオブジェクトの情報を取得します。

使用した型によって、取得される情報が決まります。

また、後述のitemアノテーションを指定することで、これら以外の値も取得することができます。

アノテーション

string name (必須)

オブジェクトのファイル名を指定します。フォルダパスは含めません。

特殊文字列"(self)"を指定すると、そのエフェクトが割り当てられたオブジェクト自身を対象にすることができます。

特殊文字列"(OffscreenOwner)"を指定すると、オフスクリーンのオーナーオブジェクトを対象にすることができます。

string item (任意)

ここに下記文字列を指定することにより、他の値を取得することができます。

☆指定されたオブジェクトが存在しない場合、以下の値が設定される。

使用例

//"stage01.x"が表示されているか否かを取得

bool flag : CONTROLOBJECT < string name = "stage01.x"; >;

//"negi.x"の回転Xを取得

float rot_x : CONTROLOBJECT < string name = "negi.x"; string item = "Rx"; >;

18.11 テクスチャ関連

通常テクスチャ

テクスチャを生成します。

型は texture, texture2D, texture3D, textureCUBE のいずれかです。

通常テクスチャの場合、特にセマンティクスはありません。

アノテーション

string ResourceType

テクスチャの種類を指定します。型と矛盾した値は指定できません。

    • "2D"

    • "3D"

    • "CUBE"

型が"texture"かつ"2D"以外のテクスチャを生成する場合には、必ずこのアノテーションを指定してください。

通常の2Dテクスチャでは省略可能です。

string ResourceName

テクスチャ画像ファイルを指定します。

サポートしているファイルフォーマットは bmp, dds, dib, jpg, png, tga です。

相対パスでファイルを指定した場合、エフェクトファイルが入っているフォルダが基準になります。

int Width

int Height

int Depth

テクスチャの幅、高さ、深さをピクセル単位で指定します。

Dimensions, ViewportRatio とは同時に指定できません。

デフォルト値は64です。ResourceNameが指定されている場合は、画像ファイルから自動的に取得されます。

int2 or int3 Dimensions

テクスチャの幅、高さ、深さをピクセル単位で指定します。

ViewportRatio, Width, Height, Depth と同時には指定できません。

float2 ViewportRatio

テクスチャの幅と高さを、スクリーンサイズの比で指定します。

スクリーンと同じサイズのテクスチャを生成するには、"float2 ViewportRatio = {1.0, 1.0};" と指定します。

Dimensions, Width, Height, Depthとは同時に指定できません。

string Format

テクスチャのフォーマットを指定します。

省略した場合、"A8R8G8B8"が使用されます。

指定可能なフォーマットは、D3DFORMAT(http://msdn.microsoft.com/ja-jp/library/bb172558(v=VS.85).aspx)を参照してください。

"A8R8G8B8"、"FMT_A8R8G8B8"、"D3DFMT_A8R8G8B8"のいずれの書式でも指定できます。

int Miplevels

ミップマップを指定したレベルで生成します。

省略するか0を指定した場合、完全なミップマップチェーンが作成されます。

1を指定すると、ミップマップは生成されません。

int Levels

Miplevelsの別名です。

使用例

texture negi_tex < string ResourceName = "negi.bmp"; >;

sampler TexSampler = sampler_state {

texture = <negi_tex>;

};

texture2D map_tex <

string ResourceName = "map.png";

int Miplevels = 1;

int Width = 64;

int Height = 64;

>;

RENDERCOLORTARGET

レンダーターゲットに指定可能なテクスチャを生成します。

このセマンティクスを指定して生成したテクスチャは、スクリプトのRenderColorTargetに指定することができます。

セマンティクス

RENDERCOLORTARGET

texture or texture2D

レンダーターゲットに使用可能なテクスチャ

アノテーション

int Width

int Height

int Depth

int2 or int3 Dimensions

float2 ViewportRatio

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

省略した場合、"float2 ViewportRatio = {1.0, 1.0};" が使用されます。

string Format

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

省略した場合、"A8R8G8B8"が使用されます。

int Miplevels

int Levels

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

使用例

texture2D ScnMap : RENDERCOLORTARGET <

float2 ViewPortRatio = {1.0,1.0};

int MipLevels = 1;

string Format = "A8R8G8B8" ;

>;

sampler2D ScnSamp = sampler_state {

texture = <ScnMap>;

};

RENDERDEPTHSTENCILTARGET

深度ステンシルを生成します。

このセマンティクスを指定して生成したテクスチャは、スクリプトのRenderDepthStencilTargetに指定することができます。

セマンティクス

RENDERDEPTHSTENCILTARGET

texture or texture2D

深度ステンシルに使用可能なテクスチャ

アノテーション

int Width

int Height

int Depth

int2 or int3 Dimensions

float2 ViewportRatio

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

省略した場合、"float2 ViewportRatio = {1.0, 1.0};" が使用されます。

string Format

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

省略した場合、"D24S8"が使用されます。

int Miplevels

int Levels

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

使用例

texture2D DepthBuffer : RENDERDEPTHSTENCILTARGET <

float2 ViewPortRatio = {2.0,2.0};

string Format = "D24S8";

>;

ANIMATEDTEXTURE

アニメーションテクスチャを生成します。

デフォルトではフレーム時間に連動して自動的にアニメーションします。

アノテーションを指定することにより、コントロールオブジェクトなどの別のパラメータに連動してアニメーションさせることもできます。

セマンティクス

ANIMATEDTEXTURE

texture or texture2D

アニメーションテクスチャ

アノテーション

string ResourceName (必須)

テクスチャの元となるアニメーション画像ファイルを指定します。

サポートしているファイルフォーマットは アニメーションGIF (.gif) および APNG (.png)です。

float Offset (省略可能)

アニメーションの開始時間を指定します。単位は秒です。

例えば2.5を指定すると、アニメーション開始が2.5秒遅れます。

デフォルトはゼロです。

float Speed (省略可能)

アニメーションの再生速度倍率を指定します。

例えば2.0を指定すると、アニメーション速度は2倍になります。

デフォルトは1.0です。

string SeekVariable (省略可能)

アニメーションのシーク制御を、フレーム時間以外の方法で行う場合に指定します。

パラメータ名を指定すると、そのパラメータ値に連動してアニメーションが行われます。

デフォルトでは、フレーム時間に連動してアニメーションします。

使用例

float atime: ControlObject < string Name = "seek.x"; >;

texture AnimeTex : ANIMATEDTEXTURE <

string ResourceName = "anime.png";

string SeekVariable="atime";

>;

OFFSCREENRENDERTARGET

オフスクリーンレンダーターゲットを生成します。

オフスクリーンレンダーターゲットを生成すると、自動的に、このレンダーターゲットに対して指定した条件でオブジェクト描画が行われます。

セマンティクス

OFFSCREENRENDERTARGET

texture or texture2D

オフスクリーンレンダーターゲット

アノテーション

int Width

int Height

int Depth

int2 or int3 Dimensions

float2 ViewportRatio

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

省略した場合、"float2 ViewportRatio = {1.0, 1.0};" が使用されます。

string Format

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

省略した場合、"D24S8"が使用されます。

int Miplevels

int Levels

通常テクスチャと同じです。上記「通常テクスチャ」項目を参照してください。

float4 ClearColor

レンダーターゲットをクリアする色を指定します。

ここで指定した色で、レンダーターゲットは自動的にクリアされます。

float ClearDepth

深度ステンシルをクリアするZ値を指定します。

ここで指定した値で、深度ステンシルは自動的にクリアされます。

bool AntiAlias

レンダリングにアンチエイリアスを使用します。

デフォルトは false です。

string DefaultEffect

オフスクリーン描画で使用するエフェクトの割り当てを指定します。

1つの割り当てを以下の書式で記述します。

"(オブジェクトファイル名)=(エフェクトファイル名);"

オブジェクト毎に使用するエフェクトファイルを切り替えるには、この割り当てを複数回記述します。

複数回記述した場合、記述した順でオブジェクトファイル名が比較され、最初に一致したものが使用される。

例: string DefaultEffect = "self=hide; Mirror*.x=hide; *=MirrorObject.fx;";

オブジェクトファイル名には"*"と"?"によるワイルドカードが指定できます。

特殊なオブジェクトファイル名として"self"が指定でき、これはこのOFFSCREENRENDERTARGETを持つエフェクト

が割り当てられたオブジェクト自身を指します。

エフェクトファイル名に相対パスでファイル名を指定した場合、参照元のエフェクトファイルが格納されているフォルダが基準となります。

また、特殊なエフェクトファイル名として"none"と"hide"が指定でき、これは、「エフェクトなし」と「非表示」を表します。

使用例

texture MirrorRT: OFFSCREENRENDERTARGET <

string Description = "OffScreen RenderTarget for Mirror.fx";

int Width = 256;

int Height = 256;

float4 ClearColor = { 1, 1, 1, 1 };

float ClearDepth = 1.0;

bool AntiAlias = true;

string DefaultEffect =

"self = hide;"

"Mirror*.x = hide;"

"*=MirrorObject.fx;";

>;

TEXTUREVALUE

指定したテクスチャのテクセル情報を取得して配列に格納します。

これを使用すると、VTF(Vertex Texture Fetching)に対応しない環境でも、頂点シェーダからテクスチャの値を参照できます。

セマンティクス

TEXTUREVALUE

float4の2次元配列 or foat4[]の1次元配列

指定テクスチャのテクセル情報

・定数レジスタで値を渡すため、参照できるテクセル数は200程度が限度です。

・配列のサイズがテクスチャのサイズと一致していない場合、値を保証しません。

・テクスチャからの値の取得は、フレームの開始時に行われます。

そのため、途中で対象のテクスチャを更新しても、次のフレームになるまで値は更新されません。

アノテーション

string TextureName (必須)

テクスチャのパラメータ名を指定します。

使用例

float4 ParticleBaseArray[TEX_HEIGHT][TEX_WIDTH] : TEXTUREVALUE <

string TextureName = "ParticleBaseTex";

>;

float4 ParticleBaseArray2[TEX_HEIGHT] : TEXTUREVALUE <

string TextureName = "ParticleBaseTex2";

>;

float4 color1 = ParticleBaseArray[v][u];

float3 color2 = ParticleBaseArray2[idx].rgb;

18.12 ☆エフェクトファイル

☆STANDARDSGLOBAL

SAS (Standard Annotations and Semantics)のバージョンを指定します。

また、エフェクトファイル全体に関するアノテーションを設定します。

パラメータ名は "Script"、型は float、値としてバージョン番号の 0.8 を指定してください。

セマンティクス

STANDARDGLOBAL

float

必ず 0.8 を指定してください。

アノテーション

string ScriptOutput (省略可能)

"color"以外の値は指定できません。

デフォルト値もこの値になります。

string ScriptClass (省略可能)

エフェクトファイルの目的を指定します。

"object"

"scene"

"sceneorobject"

オブジェクトを描画(デフォルト)。

スクリーンバッファを描画

上記の両方

オブジェクトを描画するエフェクトでは"object"を指定し、ポストエフェクト系のエフェクトでは"scene"を指定します。

"object"を指定した場合、パスのスクリプトで Draw=Buffer を実行してはいけません。

また、"scene"を指定した場合、Draw=Geometry を実行してはいけません。

"sceneorobject"を指定した場合は、両方を実行できます。

☆ string ScriptOrder (省略可能)

エフェクトファイルの実行タイミングを指定します。

"preprocess"はMMMでは実装していません。

"standard"

"preprocess"

"postprocess"

オブジェクトを描画(デフォルト)。

オブジェクト描画よりも先に描画する。プリエフェクト用

オブジェクト描画の後で描画する。ポストエフェクト用

string Script (省略可能)

使用するテクニックの検索順序を指定します。

通常は、エフェクトファイルに記述されている順番で、使用可能なテクニックが検索されますが、

このアノテーションにより明示的に順序を指定することができます。

順序は以下の書式で指定します。

"Technique=Technique?テクニック名1:テクニック名2:~;"

string Script = "Technique=Technique?SimplePS:TexturedPS:SimpleQuadraticPS:TexturedQuadraticPS;";

使用例

//通常エフェクトの場合

float Script : STANDARDSGLOBAL <

string ScriptOutput = "color";

string ScriptClass = "object";

string ScriptOrder = "standard";

> = 0.8;

//ポストエフェクトの場合

float Script : STANDARDSGLOBAL <

string ScriptOutput = "color";

string ScriptClass = "scene";

string ScriptOrder = "postprocess";

> = 0.8;

18.13 ☆特殊パラメータ

☆名前で自動的に決まるパラメータ

以下の名前を持つパラメータは、セマンティクス無しで自動的に値が与えられます。

★VertexIndexOffsetは、頂点シェーダへの入力頂点情報内にある頂点インデックス値とセットで使用します。

頂点シェーダに入ってくる頂点インデックス値は、モデル単位のインデックス値です。

従って、複数モデル、アクセサリがある場合には固有のインデックス値となりません。

全体で固有のインデックス値とするために、VertexIndexOffsetをインデックス値に足す必要があります。

★モデルエッジや材質、影など

モデルに関する情報を、下記セマンティクスにて取得することができます。

18.14 ★パラメータコントロール

MMMでは、パラメータに下記アノテーションを付けることにより、MMM上でGUI操作およびキーフレームの登録が可能です。

なお、GUIで操作可能なパラメータ型は、bool / int / float / float2 / float3 / float4 の6種類です。

boolだと、コントロールは自動的にチェックボックスになります。

使用可能なアノテーション

使用可能なUIWidget

使用例

float Extent

<

string UIName = "Extent";

string UIWidget = "Slider";

bool UIVisible = true;

float UIMin = 0.00;

float UIMax = 0.01;

> = float( 0.0005 );

18.15 ★頂点シェーダ

★MMM_SKINNING_INPUT構造体

MMM_SKINNING_INPUT は定義済みの頂点シェーダ入力構造体です。

基本的に頂点シェーダではこの構造体を使用してください。

MMM_SKINNING_INPUT

定義

struct MMM_SKINNING_INPUT{

float4 Pos : POSITION;

float4 BlendWeight : BLENDWEIGHT;

float4 BlendIndices : BLENDINDICES;

float3 Normal : NORMAL;

float2 Tex : TEXCOORD0;

float4 AddUV1 : TEXCOORD1;

float4 AddUV2 : TEXCOORD2;

float4 AddUV3 : TEXCOORD3;

float4 AddUV4 : TEXCOORD4;

float4 SdefC : TEXCOORD5;

float3 SdefR0 : TEXCOORD6;

float3 SdefR1 : TEXCOORD7;

float EdgeWeight : TEXCOORD8;

float Index : PSIZE15;

};

★スキニング(ボーン変形)用関数

MMMではボーン変形による頂点計算をGPU、つまりシェーダ内で行っています。

下記の構造体および関数を使用して、モデルのスキニングを実行してください。

スキニング後の座標と法線を取得する関数

MMM_SkinnedPositionNormal

引数1 float4 座標

引数2 float3 法線

引数3 float4 ウェイト

引数4 float4 ボーンIndex

引数5 float4 Sdef C値

引数6 float4 Sdef R0値

引数7 float4 Sdef R1値

戻り値 MMM_SKINNING_OUTPUT

使用例

VS_OUTPUT Basic_VS(MMM_SKINNING_INPUT IN)

{

...

MMM_SKINNING_OUTPUT SkinOut = MMM_SkinnedPositionNormal(IN.Pos, IN.Normal, IN.BlendWeight, IN.BlendIndices, IN.SdefC, IN.SdefR0, IN.SdefR1);

...

}

スキニング後の座標のみを取得する関数

MMM_SkinnedPosition

引数1 float4 座標

引数2 float3 法線

引数3 float4 ウェイト

引数4 float4 ボーンIndex

引数5 float4 Sdef C値

引数6 float4 Sdef R0値

引数7 float4 Sdef R1値

戻り値 float4 変換後の座標

使用例

VS_OUTPUT Basic_VS(MMM_SKINNING_INPUT IN)

{

...

float4 Position = MMM_SkinnedPosition(IN.Pos, IN.Normal, IN.BlendWeight, IN.BlendIndices, IN.SdefC, IN.SdefR0, IN.SdefR1);

...

}

MMM_SkinnedPositionNormalの戻り値

MMM_SKINNING_OUTPUT

18.16 ★陰影・シャドウ

トゥーンの色を計算する便利関数

MMM_GetToonColor

トゥーン色と法線、3つのライト方向から結果の色を取得します。

ユーザが設定した影の濃さも反映されます。

引数1 float4 Toon色

引数2 float3 法線

引数3 float3 ウェイト

引数4 float4 ライト1方向

引数5 float3 ライト2方向

引数6 float3 ライト3方向

戻り値 float4 トゥーン色

使用例

...

float3 LightDirection[MMM_LightCount] : LIGHTDIRECTIONS;

float4 MaterialToon : TOONCOLOR;

...

float4 Basic_PS(VS_OUTPUT IN)

{

...

color = MMM_GetToonColor(MaterialToon, IN.Normal, LightDirection[0], LightDirection[1], LightDirection[2]);

...

}

セルフシャドウマップから計算されたトゥーン色を取得する

MMM_GetSelfShadowToonColor

セルフシャドウによる結果の色を取得します。

引数3-5のライトから見た位置は、位置をライトWorldViewProjection行列で掛け、

Y軸をひっくりかえしたものです。

なお、Zは0.0-1.0に収まるように距離をZFarで割ります。

計算は SampleBase.fxm を見てください。これをそのまま使うことが前提となっています。

引数1 float4 Toon色

引数2 float3 法線

引数3 float4 ライト1からみた位置

引数4 float4 ライト2からみた位置

引数5 float4 ライト3からみた位置

引数6 bool ソフトシャドウ有効フラグ

引数7 bool モデルフラグ(useToon)

戻り値 float4 トゥーン色

使用例

...

float4x4 LightWVPMatrices[MMM_LightCount] : LIGHTWVPMATRICES; // 座標変換行列

float3 LightPositions[MMM_LightCount] : LIGHTPOSITIONS; // ライト位置

float LightZFars[MMM_LightCount] : LIGHTZFARS; // ライトzFar値

...

VS_OUTPUT Basic_VS(MMM_SKINNING_INPUT IN, uniform bool useSelfShadow)

{

...

if (useSelfShadow) {

float4 dpos = mul(SkinOut.Position, WorldMatrix);

//デプスマップテクスチャ座標

Out.SS_UV1 = mul(dpos, LightWVPMatrices[0]);

Out.SS_UV2 = mul(dpos, LightWVPMatrices[1]);

Out.SS_UV3 = mul(dpos, LightWVPMatrices[2]);

Out.SS_UV1.y = -Out.SS_UV1.y;

Out.SS_UV2.y = -Out.SS_UV2.y;

Out.SS_UV3.y = -Out.SS_UV3.y;

Out.SS_UV1.z = (length(LightPositions[0] - SkinOut.Position) / LightZFars[0]);

Out.SS_UV2.z = (length(LightPositions[1] - SkinOut.Position) / LightZFars[1]);

Out.SS_UV3.z = (length(LightPositions[2] - SkinOut.Position) / LightZFars[2]);

}

}

...

float4 Basic_PS(VS_OUTPUT IN, uniform bool useToon, uniform bool useSelfShadow) : COLOR0

{

...

if (useSelfShadow) {

if (useToon && usetoontexturemap) {

float3 shadow = MMM_GetToonColor(MaterialToon, IN.Normal, LightDirection[0], LightDirection[1], LightDirection[2]);

color = MMM_GetSelfShadowToonColor(MaterialToon, IN.Normal, IN.SS_UV1, IN.SS_UV2, IN.SS_UV3, false, useToon);

Color.rgb *= min(shadow, color);

}

else {

Color.rgb *= MMM_GetSelfShadowToonColor(MaterialToon, IN.Normal, IN.SS_UV1, IN.SS_UV2, IN.SS_UV3, false, useToon);

}

}

...

}

18.17 スクリプト

テクニックとパスには、スクリプトと呼ばれる特殊なアノテーションを指定することができます。

technique テクニック名 < string Script = "コマンド; コマンド; ..." ; > { ... }

pass パス名 < string Script = "コマンド; コマンド; ..." ; > { ... }

テクニックやパスの実行時には、これらのコマンドが記述順に逐次実行されます。

このスクリプトを使用することで、レンダリングターゲットの変更やクリア、パスのループ処理などを行うことができます。

RenderColorTarget=(テクスチャ名 or 空白)

RenderColorTarget0=(テクスチャ名 or 空白)

RenderColorTarget1=(テクスチャ名 or 空白)

RenderColorTarget2=(テクスチャ名 or 空白)

RenderColorTarget3=(テクスチャ名 or 空白)

レンダリングターゲットを設定します。

RenderColorTargetは、RenderColorTarget0の別名です。

通常、RenderDepthStencilTargetコマンドとセットで使用します。

また、RenderColorTarget1~3は単独で使用することはできず、必ずRenderColorTarget0とセットで使用します。

引数には、RENDERCOLORTARGETセマンティクスで宣言されたtextureパラメータの名前を指定します。

デフォルトのレンダリングターゲットにリセットする場合は、空白を指定してください。

なお、設定されたレンダリングターゲットは、再度これらのコマンドを実行しなければ、

テクニックの処理完了まで変更されたままになります。

RenderDepthStencilTarget=(テクスチャ名 or 空白)

深度ステンシルサーフェイスを設定します。

通常、RenderColorTarget0コマンドとセットで使用します。

引数には、RENDERDEPTHSTENCILTARGETセマンティクスで宣言されたtextureパラメータの名前を指定します。

デフォルトの深度ステンシルサーフェイスにリセットする場合は、空白を指定してください。

ClearSetColor=(パラメータ名)

レンダリングターゲットをクリアする色を設定する。

Clearコマンドが実行されるまでクリアはされません。

引数には、float4型のパラメータの名前を指定します。

このパラメータに設定された値が、レンダリングターゲットをクリアする色になります。

ClearSetDepth=(パラメータ名)

深度ステンシルサーフェイスをクリアするZ値を設定する。

Clearコマンドが実行されるまでクリアはされません。

引数には、float型のパラメータの名前を指定します。

このパラメータに設定された値が、深度ステンシルサーフェイスをクリアするZ値になります。

Clear=Color

レンダリングターゲットをクリアします。

クリアする色には、ClearSetColorコマンドで設定された値が使用されます。

Clear=Depth

深度ステンシルサーフェイスをクリアします。

クリアするZ値には、ClearSetDepthコマンドで設定された値が使用されます。

ScriptExternal=Color

他のオブジェクトを描画します。

このコマンドは、テクニックのスクリプト上でしか使用できません。

これは、ポストエフェクト(STANDARDSGLOBALパラメータのScriptOrderアノテーションに

"postprocess"が指定されたエフェクトファイル)でのみ実行できます。

ポストエフェクトでは、テクニックのスクリプト上で、必ず1回だけ実行しなければなりません。

Pass=(パス名)

指定したパスを実行します。

このコマンドは、テクニックのスクリプト上でしか使用できません。

テクニックにスクリプトを指定した場合、明示的にこのコマンドを使用しない限り、いずれのパスも実行されません。

LoopByCount=(パラメータ名)

LoopEnd=

指定した回数だけ、スクリプトの一部をループします。

このコマンドは、テクニックのスクリプト上でしか使用できません。

引数には、数値型(int,bool,float)のパラメータの名前を指定します。

このパラメータに設定された値の回数だけ、LoopByCountからLoopEndまでにあるコマンド列が繰り返し実行されます。

ループはネスト可能です。

以下の例では、3回パスp0が実行された後、パスp1が実行されます。

int Count = 3;

technique TShader <

string Script =

"LoopByCount=Count;"

"Pass=p0;"

"LoopEnd=;"

"Pass=p1;";

> {

LoopGetIndex=(パラメータ名)

ループ中のループカウンタの値を、指定したパラメータに設定します。

このコマンドは、LoopByCountからLoopEndまでの間でしか使用できません。

Draw=Geometry

オブジェクトを描画します。

このコマンドは、パスのスクリプト上でしか使用できません。

パスのスクリプトを省略した場合、このコマンドが実行されます。

STANDARDSGLOBALのScriptClassに"scene"を指定している場合、このコマンドを実行してはいけません。

Draw=Buffer

レンダリングターゲットのスクリーンと一致するサイズの、長方形のポリゴンを描画します。

このコマンドは、パスのスクリプト上でしか使用できません。

ポストエフェクトやプリエフェクトで使用します。

STANDARDSGLOBALのScriptClassに"object"を指定している場合、このコマンドを実行してはいけません。

使用例

technique TShader <

string Script =

"RenderColorTarget0=RenderTarget;"

"RenderDepthStencilTarget=DepthBuffer;"

"ClearSetColor=ClearColor;"

"ClearSetDepth=ClearDepth;"

"Clear=Color;"

"Clear=Depth;"

"ScriptExternal=color;"

"Pass=P0;" ;

> {

pass P0 < string Script= "RenderColorTarget0=; RenderDepthStencilTarget=; Draw=Buffer;" ; > {

...

}

}

18.18 その他

shared パラメータ

パラメータ宣言に shared キーワードを指定することで、異なるエフェクトファイル間でパラメータを共有することができます。

共有するためには、同じ名前、同じ型、同じセマンティクスでなければなりません。

なお、パラメータの設定は描画順が早いものが優先されます。

また、オフスクリーンのパラメータはその親エフェクトの設定が優先になります。

使用例

effect1.fx

shared texture ShadowBuffer : RENDERCOLORTARGET <

float2 ViewPortRatio = {2.0,2.0};

int MipLevels = 1;

string Format = "A8R8G8B8" ;

>;

effect2.fx

shared texture ShadowBuffer : RENDERCOLORTARGET;

#include

#includeで他のファイルを指定することにより、他のファイル内容をエフェクトファイル内に差し込むことができます。

使用例

#include "header.fxh"