3 スクリプト
テクニックとパスには、スクリプトと呼ばれる特殊なアノテーションを指定することができる。
technique テクニック名 < string Script = "コマンド; コマンド; ..." ; > { ... } pass パス名 < string Script = "コマンド; コマンド; ..." ; > { ... }
実行時には、これらのコマンドが、記述順に逐次実行される。
このスクリプトを使用することで、レンダリングターゲットの変更やクリア、パスのループ処理などを行うことができる。
ポストエフェクトなどの特殊な処理をしないのであれば、通常、スクリプトの指定は不要である。テクニックのスクリプトを省略した場合、単にテクニックのパスが順に実行される。また、パスのスクリプトを省略した場合、"Draw=Geometry"が実行される。
3.1 コマンド
- RenderColorTarget(0~3) = (テクスチャ名 or 空白)
レンダリングターゲットを設定する。RenderColorTargetは、RenderColorTarget0の別名である。
通常、RenderDepthStencilTargetコマンドとセットで使用する。また、RenderColorTarget1~3は単独で使用することはできず、必ずRenderColorTarget0とセットで使用する。
引数には、RENDERCOLORTARGETセマンティクスで宣言されたtextureパラメータの名前を指定する。デフォルトのレンダリングターゲットにリセットする場合は、空白を指定する。
なお、設定されたレンダリングターゲットは、再度これらのコマンドを実行しなければ、テクニックの処理完了まで変更されたままである。 - RenderDepthStencilTarget = (テクスチャ名 or 空白)
深度ステンシルサーフェイス(いわゆるZバッファ)を設定する。通常、RenderColorTarget0コマンドとセットで使用する。
引数には、RENDERDEPTHSTENCILTARGETセマンティクスで宣言されたtextureパラメータの名前を指定する。
デフォルトの深度ステンシルサーフェイスにリセットする場合は、空白を指定する。 - ClearSetColor = (パラメータ名)
レンダリングターゲットをクリアする色を設定する。(まだクリアはしない)引数には、float4型のパラメータの名前を指定する。このパラメータに設定された値が、レンダリングターゲットをクリアする色となる。
- ClearSetDepth = (パラメータ名)
深度ステンシルサーフェイスをクリアするZ値を設定する。(まだクリアはしない)引数には、float型のパラメータの名前を指定する。このパラメータに設定された値が、深度ステンシルサーフェイスをクリアするZ値となる。
- Clear = Color
レンダリングターゲットをクリアする。クリアする色には、ClearSetColorコマンドで設定された値が使用される。
- Clear = Depth
深度ステンシルサーフェイスをクリアする。クリアするZ値には、ClearSetDepthコマンドで設定された値が使用される。
- ScriptExternal = Color
他のオブジェクトを描画する。このコマンドは、テクニックのスクリプト上でしか使用できない。これは、ポストエフェクト(STANDARDSGLOBALパラメータのScriptOrderアノテーションに"postprocess"が指定されたエフェクトファイル)でのみ実行できる。
通常、ポストエフェクトでは、入力用のテクスチャをレンダリングターゲットに設定した上で、そのテクスチャへ、他のオブジェクトをレンダリングさせる。この、他のオブジェクトをレンダリングさせる際に、このコマンドを実行する。(4.8 Tipsポストエフェクトを参照)
ポストエフェクトでは、テクニックのスクリプト上で、必ず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"を指定している場合、このコマンドを実行してはならない。
- RenderPort = *
未対応。
○使用例
technique TShader < /* 2つの文字列表記("~" "~")の間に空白文字しかなければ、 それはひと続きの文字列とみなされるため、以下のように分割して記述できる */ 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;" ; > { ... } }