Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CEDEC 2005 汎用的なシェーダ設計 イントロダクション

20,557 views

Published on

シリコンスタジオ株式会社 技術資料
http://www.siliconstudio.co.jp/presentations/

Published in: Technology
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

CEDEC 2005 汎用的なシェーダ設計 イントロダクション

  1. 1. 汎用的なシェーダ設計汎用的なシェーダ設計 イントロダクションイントロダクション シリコンスタジオ株式会社シリコンスタジオ株式会社 川瀬 正樹川瀬 正樹 masa@siliconstudio.co.jpmasa@siliconstudio.co.jp
  2. 2. アジェンダアジェンダ • シェーダシェーダを取り巻く環境を取り巻く環境 • シェーダの組み込みシェーダの組み込み • シェーダシェーダパイプラインパイプラインの設計の設計 • 組み合わせ組み合わせの自動生成の自動生成 • HLSLを使った設計HLSLを使った設計 • 組み合わせ組み合わせの発散問題の発散問題 • シェーダを減らすシェーダを減らす • シェーダの管理シェーダの管理 • 実装例実装例
  3. 3. シェーダを取り巻く環境シェーダを取り巻く環境 アジェンダアジェンダ
  4. 4. シェーダを取り巻く環境シェーダを取り巻く環境 • 次世代以降は全てプログラマブルシェーダ次世代以降は全てプログラマブルシェーダ – PCPC – Xbox 360Xbox 360 – PS3PS3 • シェーダを利用した技術の研究シェーダを利用した技術の研究 – どんどん進んでいるどんどん進んでいる • サンプル/デモは充実しているサンプル/デモは充実している – ハードウェアベンダの開発者向けハードウェアベンダの開発者向け webweb ページページ – DirectX SDKDirectX SDK – etc.etc. • とりあえず書いてみる/試してみるとりあえず書いてみる/試してみる – 非常に簡単非常に簡単
  5. 5. シェーダの組み込みシェーダの組み込み アジェンダアジェンダ
  6. 6. シェーダをゲームに利用したいシェーダをゲームに利用したい • インハウスエンジンへの組み込みインハウスエンジンへの組み込み – ポストエフェクトなどのシェーダポストエフェクトなどのシェーダ • 他の処理との独立性が高い他の処理との独立性が高い • 組み込みは比較的容易組み込みは比較的容易 – シーンレンダリングのマテリアルシェーダシーンレンダリングのマテリアルシェーダ • 考慮すべき事項が多い考慮すべき事項が多い • 一般的に面倒一般的に面倒
  7. 7. シーンレンダリングのシェーダシーンレンダリングのシェーダ • サンプルに特化したシェーダとは違うサンプルに特化したシェーダとは違う • サンプル/デモサンプル/デモ – 特化した少数のシェーダを用意するだけで良い特化した少数のシェーダを用意するだけで良い • ゲームなどの応用プログラムゲームなどの応用プログラム – さまざまな条件のシェーダが必要さまざまな条件のシェーダが必要
  8. 8. シェーダを利用するにはシェーダを利用するには • あるマテリアル表現のシェーダを追加したいあるマテリアル表現のシェーダを追加したい – 例えば動的環境マップ例えば動的環境マップ • 専用のシェーダを一つ追加するだけ?専用のシェーダを一つ追加するだけ? – …それだけなら簡単だが…それだけなら簡単だが • 現実にはそう簡単にはいかない現実にはそう簡単にはいかない – シェーダはいろいろな機能から構成されるシェーダはいろいろな機能から構成される – その他の処理の条件は?その他の処理の条件は?
  9. 9. その他の処理は?その他の処理は? • 頂点アニメーションは?頂点アニメーションは? – 無し?無し? – インデクス付きスキニング?インデクス付きスキニング? – モーフィング?モーフィング? • ライティングの条件は?ライティングの条件は? – 無し?無し? – 平行光源いくつ?平行光源いくつ? – 点光源いくつ?点光源いくつ? – スペキュラーは?スペキュラーは? – 自己発光は?自己発光は?
  10. 10. その他の処理は?(2)その他の処理は?(2) • シャドウは?シャドウは? • フォグは?フォグは? • 環境マップ以外のテクスチャは?環境マップ以外のテクスチャは? – いくつ使う?いくつ使う? – どういう演算で合成する?どういう演算で合成する? • 法線マップ(バンプマップ)を利用する?法線マップ(バンプマップ)を利用する? • etc. etc. etc.etc. etc. etc.
  11. 11. シェーダを利用するにはシェーダを利用するには • 特定の機能のシェーダを追加するには特定の機能のシェーダを追加するには – 他の処理との組み合わせが必須他の処理との組み合わせが必須 – 1つのシェーダを追加するだけでは対応できない1つのシェーダを追加するだけでは対応できない
  12. 12. シェーダパイプラインの設計シェーダパイプラインの設計 アジェンダアジェンダ
  13. 13. シェーダパイプラインシェーダパイプライン • パイプラインパイプライン – シェーダとしての処理の流れシェーダとしての処理の流れ – 一連のファンクションの流れ一連のファンクションの流れ • ファンクションファンクション – パイプライン(シェーダ)を構成する各機能ブロック/フェパイプライン(シェーダ)を構成する各機能ブロック/フェ ーズーズ – ファンクションの例ファンクションの例 • アニメーションアニメーション • 座標変換座標変換 • テクスチャ座標処理テクスチャ座標処理 • 環境マップ座標生成環境マップ座標生成 • ライティング処理ライティング処理 • etc.etc.
  14. 14. シェーダパイプライン(2)シェーダパイプライン(2) • フラグメントフラグメント – 各ファンクションの具体的な動作各ファンクションの具体的な動作 – コード断片コード断片 – 環境マップ座標生成ファンクションのフラグメント環境マップ座標生成ファンクションのフラグメント 例例 • 無効無効 • ワールド基底キューブマップ座標生成ワールド基底キューブマップ座標生成 • スフィアマップ座標生成スフィアマップ座標生成 • 平面反射マップ座標生成平面反射マップ座標生成 • etc.etc.
  15. 15. シェーダパイプライン(3)シェーダパイプライン(3) 各経路がそれぞれ一つのシェーダ各経路がそれぞれ一つのシェーダ ファンクションファンクション EE ファンクションファンクション DD ファンクションファンクション CC ファンクションファンクション BB ファンクションファンクション AA シ ェー ダ パ イ プ ラ イ ン シ ェー ダ パ イ プ ラ イ ン フラグメントフラグメント C-0C-0 フラグメントフラグメント C-1C-1 フラグメントフラグメント C-2C-2 フラグメントフラグメント D-0D-0 フラグメントフラグメント D-1D-1 フラグメントフラグメント B-0B-0 フラグメントフラグメント B-1B-1 フラグメントフラグメント B-2B-2 フラグメントフラグメント B-3B-3 フラグメントフラグメント E-0E-0 フラグメントフラグメント E-1E-1 フラグメントフラグメント E-2E-2 フラグメントフラグメント E-3E-3 フラグメントフラグメント A-0A-0
  16. 16. 経路がシェーダとなる経路がシェーダとなる A-0A-0 B-0B-0 C-0C-0 D-0D-0 E-0E-0 シェーダシェーダ #0#0 経路経路 A0-B0-C0-D0-E0A0-B0-C0-D0-E0 A-0A-0 B-1B-1 C-0C-0 D-0D-0 E-0E-0 シェーダシェーダ #1#1 経路経路 A0-B1-C0-D0-E0A0-B1-C0-D0-E0 A-0A-0 B-2B-2 C-0C-0 D-0D-0 E-0E-0 シェーダシェーダ #2#2 経路経路 A0-B2-C0-D0-E0A0-B2-C0-D0-E0
  17. 17. 組み合わせを作る組み合わせを作る • 機能を組み合わせたシェーダを作るアプローチ機能を組み合わせたシェーダを作るアプローチ – 必要な組み合わせを手作業で作成必要な組み合わせを手作業で作成 – 組み合わせをツールで自動生成組み合わせをツールで自動生成
  18. 18. 組み合わせを手作業で作成組み合わせを手作業で作成 • 設計は楽設計は楽 • 新しいシェーダの追加が面倒新しいシェーダの追加が面倒 – 既存の機能の組み合わせごとに新しい機能を追加し既存の機能の組み合わせごとに新しい機能を追加し たシェーダが必要たシェーダが必要 – ファンクションが増えてくるほど追加が大変になるファンクションが増えてくるほど追加が大変になる • 組み合わせ総数が増えるほど開発効率が落ちる組み合わせ総数が増えるほど開発効率が落ちる • 100を超えるとちょっと厳しい100を超えるとちょっと厳しい • 組み合わせの少ないエンジンに向いている組み合わせの少ないエンジンに向いている – 汎用性は低い汎用性は低い – シェーダのフロー制御により以前よりは現実的シェーダのフロー制御により以前よりは現実的
  19. 19. 組み合わせの自動生成組み合わせの自動生成 アジェンダアジェンダ
  20. 20. 組み合わせを自動生成組み合わせを自動生成 • 組み合わせ作成へのもう1つのアプローチ組み合わせ作成へのもう1つのアプローチ • 汎用性/拡張性の高いエンジン向き汎用性/拡張性の高いエンジン向き • メタ言語でシェーダパイプラインを定義メタ言語でシェーダパイプラインを定義 • 最終的なシェーダコードはツールで生成最終的なシェーダコードはツールで生成 • 設計はやや面倒設計はやや面倒 – シェーダコードを生成するツールシェーダコードを生成するツール – コード生成制御メタ言語コード生成制御メタ言語
  21. 21. シェーダコード生成の制御シェーダコード生成の制御 • メタ言語で構成を定義メタ言語で構成を定義 – パイプラインパイプライン • パイプラインを構成するファンクションパイプラインを構成するファンクション • ベースとなるシェーダ(ファイル)の指定ベースとなるシェーダ(ファイル)の指定 • パイプライン固有のコードなどパイプライン固有のコードなど – シェーダに挿入される定数定義などシェーダに挿入される定数定義など – ファンクションファンクション • ファンクションの持つフラグメント種別ファンクションの持つフラグメント種別 • ファンクション固有のコードなどファンクション固有のコードなど – フラグメントフラグメント • 不要な組み合わせの無効化指定不要な組み合わせの無効化指定 • フラグメント固有のコードなどフラグメント固有のコードなど
  22. 22. メタ言語による定義例メタ言語による定義例 // --------------------------------------------------------// -------------------------------------------------------- //// 頂点シェーダパイプライン頂点シェーダパイプライン vs_pipevs_pipe VSPIPE_STANDARDVSPIPE_STANDARD {{ //// 当該パイプラインのベースとなる当該パイプラインのベースとなる //// シェーダコードシェーダコード codecode VSPIPE_STANDARD.hlslVSPIPE_STANDARD.hlsl //// パイプラインを構成するファンクションパイプラインを構成するファンクション VSFUNC_ANIMATIONVSFUNC_ANIMATION VSFUNC_TRANSFORMVSFUNC_TRANSFORM VSFUNC_TEXCOORDVSFUNC_TEXCOORD }} // -------------------------------------------------------// ------------------------------------------------------- //// 頂点シェーダファンクション定義頂点シェーダファンクション定義 // VSPIPE_STANDARD// VSPIPE_STANDARD のファンクションのファンクション //// 座標変換ファンクション座標変換ファンクション vs_functionvs_function VSFUNC_TRANSFORMVSFUNC_TRANSFORM {{ //// 当該ファンクションのフラグメント種別当該ファンクションのフラグメント種別 VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS //// 同次座標変換同次座標変換 }} //// 頂点シェーダファンクション頂点シェーダファンクション (( テクスチャ座標出力テクスチャ座標出力 )) vs_functionvs_function VSFUNC_TEXCOORDVSFUNC_TEXCOORD {{ //// 当該ファンクションのフラグメント種別当該ファンクションのフラグメント種別 VSFRG_TEX_PASSTHRUVSFRG_TEX_PASSTHRU VSFRG_TEX_SPHEREMAPVSFRG_TEX_SPHEREMAP //// スフィアマップスフィアマップ //// カメラスペース座標カメラスペース座標 VSFRG_TEX_CAMERASPACEPOSITIONVSFRG_TEX_CAMERASPACEPOSITION }} // -------------------------------------------------------// ------------------------------------------------------- //// 頂点シェーダフラグメント定義頂点シェーダフラグメント定義 //------------------------------------//------------------------------------ // VSFUNC_TRANSFORM// VSFUNC_TRANSFORM のフラグメント種別のフラグメント種別 //// 同次座標変換同次座標変換 vs_fragmentvs_fragment VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS {{ //// シェーダコードの直前に挿入されるコードシェーダコードの直前に挿入されるコード defdef #define#define ENABLE_TRANSFORM_HPOSENABLE_TRANSFORM_HPOS }} //------------------------------------//------------------------------------ // VSFUNC_TEXCOORD// VSFUNC_TEXCOORD のフラグメント種別のフラグメント種別 //// そのまま出力そのまま出力 vs_fragmentvs_fragment VSFRG_TEX_PASSTHRUVSFRG_TEX_PASSTHRU {{ }} //// スフィアマップ座標出力スフィアマップ座標出力 vs_fragmentvs_fragment VSFRG_TEX_SPHEREMAPVSFRG_TEX_SPHEREMAP {{ //// シェーダコードの直前に挿入されるコードシェーダコードの直前に挿入されるコード defdef #define TEXGEN_SPHEREMAP#define TEXGEN_SPHEREMAP }} //// カメラスペース座標を出力カメラスペース座標を出力 vs_fragmentvs_fragment VSFRG_TEX_CAMERASPACEPOSITIONVSFRG_TEX_CAMERASPACEPOSITION {{ defdef #define#define TEXGEN_CAMERAPOSITIONTEXGEN_CAMERAPOSITION }}
  23. 23. シェーダコードの記述シェーダコードの記述 • パイプラインの機能を処理するシェーダを書くパイプラインの機能を処理するシェーダを書く – 定数の条件によってフラグメントを選択定数の条件によってフラグメントを選択 • #define#define やや static conststatic const 変数などで識別変数などで識別 • 簡単で扱いやすい簡単で扱いやすい • 柔軟にコーディングできる柔軟にコーディングできる – ファンクション間では任意のコードを処理できるファンクション間では任意のコードを処理できる – メタ言語での定義順序と一致する必要はないメタ言語での定義順序と一致する必要はない – 実行順序を変更してもメタ言語での定義は変更しなくて済む実行順序を変更してもメタ言語での定義は変更しなくて済む – メタ言語で定義した内容との整合性にだけは注意メタ言語で定義した内容との整合性にだけは注意
  24. 24. シェーダコード例シェーダコード例 //// フラグメント種別によって処理を変更フラグメント種別によって処理を変更 #ifdef#ifdef ENABLE_TRANSFORM_HPOSENABLE_TRANSFORM_HPOS vOut.vPosition = Transform(vIn.vPosition) ;vOut.vPosition = Transform(vIn.vPosition) ; #endif#endif // #ifdef ENABLE_TRANSFORM_HPOS// #ifdef ENABLE_TRANSFORM_HPOS #ifdef#ifdef TEXGEN_SPHEREMAPTEXGEN_SPHEREMAP vOut.vTexCoordvOut.vTexCoord = GenerateSphereMapTexCoord() ;= GenerateSphereMapTexCoord() ; #endif#endif // #ifdef TEXGEN_SPHEREMAP// #ifdef TEXGEN_SPHEREMAP #ifdef#ifdef TEXGEN_CAMERAPOSITIONTEXGEN_CAMERAPOSITION vOut.vTexCoord = GenerateCameraSpacePosition(vIn.vPosition) ;vOut.vTexCoord = GenerateCameraSpacePosition(vIn.vPosition) ; #endif#endif // #ifdef TEXGEN_CAMERAPOSITION// #ifdef TEXGEN_CAMERAPOSITION .. .. ..
  25. 25. シェーダコードの生成シェーダコードの生成 • ツールでシェーダコード生成ツールでシェーダコード生成 – フラグメント種別を定義するコードを生成フラグメント種別を定義するコードを生成 – またはメタ言語上で任意のコードを記述可能にまたはメタ言語上で任意のコードを記述可能に • 自由な定義を書けるため柔軟性は高い自由な定義を書けるため柔軟性は高い – ツールがシェーダの直前に定義コードを挿入ツールがシェーダの直前に定義コードを挿入
  26. 26. HLSLを使った設計HLSLを使った設計 アジェンダアジェンダ
  27. 27. 自動生成とアセンブリ/HLS自動生成とアセンブリ/HLS LL • 自動生成とアセンブリシェーダの相性は良くな自動生成とアセンブリシェーダの相性は良くな いい – 通常最適化されない(一部例外あり)通常最適化されない(一部例外あり) • 必要な処理の管理/最適化必要な処理の管理/最適化 – 一時レジスタの管理が大変一時レジスタの管理が大変 • 不要なレジスタは極力使用しない不要なレジスタは極力使用しない – 一時レジスタの数に制限がある一時レジスタの数に制限がある – 一時レジスタの使用数がパフォーマンスに影響する一時レジスタの使用数がパフォーマンスに影響する – 多少の無駄が発生してしまう可能性が高い多少の無駄が発生してしまう可能性が高い • HLSLHLSL とは相性が良いとは相性が良い – コード生成/連結後に最適化されるコード生成/連結後に最適化される – 変数はいくらでも利用できる変数はいくらでも利用できる • 不要な変数は不要な変数は HLSLHLSL コンパイラが自動的に削除コンパイラが自動的に削除
  28. 28. 高水準言語を使用高水準言語を使用 • 今後は今後は HLSLHLSL // CgCg を利用するを利用する – デメリットよりもメリットの方が大きいデメリットよりもメリットの方が大きい • ID3DXEffectID3DXEffect // CgFXCgFX などのエフェクト機構などのエフェクト機構 – 便利だが組み合わせとの相性があまり良くない便利だが組み合わせとの相性があまり良くない • 頂点/ピクセルシェーダのペア(頂点/ピクセルシェーダのペア( techniquetechnique )の定義が必)の定義が必 要要 • 考えられる組み合わせが多過ぎる考えられる組み合わせが多過ぎる – 利用しない方が汎用性は高い利用しない方が汎用性は高い • 組み合わせが少数なら問題ない組み合わせが少数なら問題ない • データに依存してシェーダを生成するなど、使用する組みデータに依存してシェーダを生成するなど、使用する組み 合わせを予め制限できる場合も問題ない合わせを予め制限できる場合も問題ない
  29. 29. エフェクトを使わない場合エフェクトを使わない場合 • 組み合わせ毎に個別にコードをコンパイル組み合わせ毎に個別にコードをコンパイル – シェーダに付随する情報は自分で管理シェーダに付随する情報は自分で管理 – Direct3DDirect3D の場合の場合 • D3DXGetShader*()D3DXGetShader*() でコンパイル結果から情報を取得できでコンパイル結果から情報を取得でき るる – D3DXGetShaderConstantTable()D3DXGetShaderConstantTable() – D3DXGetShaderInputSemantics()D3DXGetShaderInputSemantics() – D3DXGetShaderOutputSemantics()D3DXGetShaderOutputSemantics() – D3DXGetShaderSamplers()D3DXGetShaderSamplers() – etc.etc.
  30. 30. 入出力セマンティックの定義入出力セマンティックの定義 • メタ言語で必要なセマンティックを指定メタ言語で必要なセマンティックを指定 – セマンティック/型および要素数/変数名などセマンティック/型および要素数/変数名など – パイプライン/ファンクション/フラグメント単位パイプライン/ファンクション/フラグメント単位 に指定に指定 • それぞれのレベルで指定可能にしておくと良いそれぞれのレベルで指定可能にしておくと良い • ツールでツールで HLSLHLSL の定義コードを生成の定義コードを生成 – シェーダ毎に生成シェーダ毎に生成 • コード中に必要とされたセマンティックコード中に必要とされたセマンティック – 入出力パラメタを構造体として定義入出力パラメタを構造体として定義
  31. 31. メタ言語サンプルメタ言語サンプル // -----------------------------------------------------------------------------------------// ----------------------------------------------------------------------------------------- //// 頂点/ピクセルシェーダ入出力セマンティック頂点/ピクセルシェーダ入出力セマンティック shader_semanticsshader_semantics {{ //// 入出力指定入出力指定 変数名変数名 型型 ,, セマンティックセマンティック vs_invs_in vPositionvPosition float3float3,, POSITIONPOSITION //// 頂点座標頂点座標 vs_outvs_out vPositionvPosition float4float4,, POSITIONPOSITION //// 出力同次座標出力同次座標 vs_invs_in vNormalvNormal float3float3,, NORMALNORMAL //// 法線ベクトル法線ベクトル vs_outvs_out vNormalvNormal float3float3,, TEXCOORD4TEXCOORD4 ps_inps_in vNormalvNormal half3half3,, TEXCOORD4TEXCOORD4 vs_invs_in vTangentvTangent float3float3,, TANGENTTANGENT //// 接線ベクトル接線ベクトル vs_outvs_out vTangentvTangent float3float3,, TEXCOORD5TEXCOORD5 ps_inps_in vTangentvTangent half3half3,, TEXCOORD5TEXCOORD5 vs_invs_in vTexCoord2DvTexCoord2D float2float2,, TEXCOORD0TEXCOORD0 //// テクスチャ座標0テクスチャ座標0 vs_outvs_out vTexCoord2DvTexCoord2D float2float2,, TEXCOORD0TEXCOORD0 ps_inps_in vTexCoord2DvTexCoord2D half2half2,, TEXCOORD0TEXCOORD0 }} // -----------------------------------------------------------------------------------------// ----------------------------------------------------------------------------------------- //// 頂点シェーダパイプライン頂点シェーダパイプライン (( 標準的なパイプライン標準的なパイプライン )) vs_pipevs_pipe VSPIPE_STANDARDVSPIPE_STANDARD {{ //// 当該パイプラインのベースとなるシェーダコード当該パイプラインのベースとなるシェーダコード codecode VSPIPE_STANDARD.hlslVSPIPE_STANDARD.hlsl //// パイプラインを構成するファンクションパイプラインを構成するファンクション VSFUNC_ANIMATIONVSFUNC_ANIMATION VSFUNC_TRANSFORMVSFUNC_TRANSFORM VSFUNC_NORMALMAPVSFUNC_NORMALMAP VSFUNC_TEXCOORD0VSFUNC_TEXCOORD0 }}
  32. 32. メタ言語サンプル(2)メタ言語サンプル(2) // -----------------------------------------------------------// ----------------------------------------------------------- //// 頂点シェーダファンクション定義頂点シェーダファンクション定義 // VSPIPE_STANDARD// VSPIPE_STANDARD //// 頂点シェーダファンクション頂点シェーダファンクション (( 座標変換座標変換 )) vs_functionvs_function VSFUNC_TRANSFORMVSFUNC_TRANSFORM {{ //// 当該ファンクションのフラグメント種別当該ファンクションのフラグメント種別 VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS //// 同次座標変換同次座標変換 //// 当該ファンクション共通の入出力セマンティッ当該ファンクション共通の入出力セマンティッ クク vs_invs_in vPositionvPosition //// 頂点座標入力頂点座標入力 }} //// 頂点シェーダファンクション頂点シェーダファンクション (( 法線マップセットアップ法線マップセットアップ )) vs_functionvs_function VSFUNC_NORMALMAPVSFUNC_NORMALMAP {{ //// 当該ファンクションのフラグメント種別当該ファンクションのフラグメント種別 VSFRG_NORMALMAP_NONEVSFRG_NORMALMAP_NONE //// 法法 線マップ無効線マップ無効 VSFRG_NORMALMAP_ENABLEVSFRG_NORMALMAP_ENABLE //// 法法 線マップ有効線マップ有効 //// 当該ファンクション共通の入出力セマンティッ当該ファンクション共通の入出力セマンティッ クク vs_invs_in vNormalvNormal //// 法線ベクトル入力法線ベクトル入力 }} // -----------------------------------------------------------// ----------------------------------------------------------- //// 頂点シェーダフラグメント定義頂点シェーダフラグメント定義 // VSFUNC_TRANSFORM// VSFUNC_TRANSFORM //// 頂点シェーダフラグメント頂点シェーダフラグメント (( 同次座標変換同次座標変換 )) vs_fragmentvs_fragment VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS {{ //// シェーダコードの直前に挿入されるコードシェーダコードの直前に挿入されるコード defdef #define#define ENABLE_TRANSFORM_HPOSENABLE_TRANSFORM_HPOS //// 当該フラグメントで必要な入出力セマンティッ当該フラグメントで必要な入出力セマンティッ クク vs_outvs_out vPositionvPosition //// 同次座標出力同次座標出力 }} // -----------------------------------------------------------// ----------------------------------------------------------- //// 頂点シェーダフラグメント定義頂点シェーダフラグメント定義 // VSFUNC_NORMALMAP// VSFUNC_NORMALMAP //// 頂点シェーダフラグメント頂点シェーダフラグメント (( タンジェントベクトル無効タンジェントベクトル無効 )) vs_fragmentvs_fragment VSFRG_NORMALMAP_NONEVSFRG_NORMALMAP_NONE {{ }} //// 頂点シェーダフラグメント頂点シェーダフラグメント (( タンジェントベクトルセットアッタンジェントベクトルセットアッ ププ )) vs_fragmentvs_fragment VSFRG_NORMALMAP_ENABLEVSFRG_NORMALMAP_ENABLE {{ //// シェーダコードの直前に挿入されるコードシェーダコードの直前に挿入されるコード defdef #define ENABLE_SETUPTANGENT#define ENABLE_SETUPTANGENT //// 当該フラグメントで必要な入出力セマンティッ当該フラグメントで必要な入出力セマンティッ クク vs_invs_in vTangentvTangent //// 接線ベクトル入接線ベクトル入 力力 vs_outvs_out vNormalvNormal //// 法線ベクトル出法線ベクトル出
  33. 33. 生成されるシェーダコード生成されるシェーダコード //-------------------------------------------------------//------------------------------------------------------- // VSPIPE_STANDARD// VSPIPE_STANDARD シェーダパイプラインシェーダパイプライン // "VSPIPE_STANDARD.hlsl"// "VSPIPE_STANDARD.hlsl" 直前に挿入されるコード直前に挿入されるコード //// 全フラグメント種別全フラグメント種別 IDID #define#define VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS 00 #define#define VSFRG_NORMALMAP_NONEVSFRG_NORMALMAP_NONE 00 #define#define VSFRG_NORMALMAP_ENABLEVSFRG_NORMALMAP_ENABLE 11 //// 頂点シェーダファンクションのフラグメントタイプ頂点シェーダファンクションのフラグメントタイプ #define#define VSFUNC_TRANSFORMVSFUNC_TRANSFORM VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS #define#define VSFUNC_NORMALMAPVSFUNC_NORMALMAP VSFRG_NORMALMAP_ENABLEVSFRG_NORMALMAP_ENABLE //// メタ言語で挿入指定されたコードメタ言語で挿入指定されたコード #define#define ENABLE_TRANSFORM_HPOSENABLE_TRANSFORM_HPOS #define#define ENABLE_SETUPTANGENTENABLE_SETUPTANGENT //// 頂点シェーダ入力頂点シェーダ入力 structstruct VS_INPUTVS_INPUT {{ float3float3 vPositionvPosition :: POSITIONPOSITION float3float3 vNormalvNormal :: NORMALNORMAL float3float3 vTangentvTangent :: TANGENTTANGENT } ;} ; //// 頂点シェーダ出力頂点シェーダ出力 structstruct VS_OUTPUTVS_OUTPUT {{ float4float4 vPositionvPosition :: POSITIONPOSITION float3float3 vNormalvNormal :: TEXCOORD4TEXCOORD4 float3float3 vTangentvTangent :: TEXCOORD5TEXCOORD5 自動生成され挿入されるコード部分自動生成され挿入されるコード部分 //-------------------------------------------------------//------------------------------------------------------- // "VSPIPE_STANDARD.hlsl"// "VSPIPE_STANDARD.hlsl" // VSPIPE_STANDARD// VSPIPE_STANDARD パイプラインのベースシェーダパイプラインのベースシェーダ コードコード #include#include "HLSLDEF.h""HLSLDEF.h" //-------------------------------------------------------//------------------------------------------------------- //// 頂点シェーダ処理頂点シェーダ処理 VS_OUTPUTVS_OUTPUT VS_main(VS_main(VS_INPUTVS_INPUT vIn)vIn) {{ VS_OUTPUTVS_OUTPUT vOut = (vOut = (VS_OUTPUTVS_OUTPUT)0 ;)0 ; #ifdef#ifdef ENABLE_TRANSFORM_HPOSENABLE_TRANSFORM_HPOS vOut.vOut.vPositionvPosition = Transform(vIn.= Transform(vIn.vPositionvPosition) ;) ; #endif#endif // #ifdef ENABLE_TRANSFORM_HPOS// #ifdef ENABLE_TRANSFORM_HPOS #ifdef#ifdef ENABLE_SETUPTANGENTENABLE_SETUPTANGENT SetupTangent(vIn.SetupTangent(vIn.vNormalvNormal, vIn., vIn.vTangentvTangent,, vOut.vOut.vNormalvNormal, vOut., vOut.vTangentvTangent) ;) ; #endif#endif // #ifdef ENABLE_SETUPTANGENT// #ifdef ENABLE_SETUPTANGENT .. .. .. returnreturn vOut ;vOut ; }} ベースとなるシェーダコード部分ベースとなるシェーダコード部分
  34. 34. 生成されるシェーダコード生成されるシェーダコード (2)(2) //-------------------------------------------------------//------------------------------------------------------- // VSPIPE_STANDARD// VSPIPE_STANDARD シェーダパイプラインシェーダパイプライン // "VSPIPE_STANDARD.hlsl"// "VSPIPE_STANDARD.hlsl" 直前に挿入されるコード直前に挿入されるコード //// 全フラグメント種別全フラグメント種別 IDID #define#define VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS 00 #define#define VSFRG_NORMALMAP_NONEVSFRG_NORMALMAP_NONE 00 #define#define VSFRG_NORMALMAP_ENABLEVSFRG_NORMALMAP_ENABLE 11 //// 頂点シェーダファンクションのフラグメントタイプ頂点シェーダファンクションのフラグメントタイプ #define#define VSFUNC_TRANSFORMVSFUNC_TRANSFORM VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS #define#define VSFUNC_NORMALMAPVSFUNC_NORMALMAP VSFRG_NORMALMAP_NONEVSFRG_NORMALMAP_NONE //// メタ言語で挿入指定されたコードメタ言語で挿入指定されたコード #define#define ENABLE_TRANSFORM_HPOSENABLE_TRANSFORM_HPOS //// 頂点シェーダ入力頂点シェーダ入力 structstruct VS_INPUTVS_INPUT {{ float3float3 vPositionvPosition :: POSITIONPOSITION float3float3 vNormalvNormal :: NORMALNORMAL } ;} ; //// 頂点シェーダ出力頂点シェーダ出力 structstruct VS_OUTPUTVS_OUTPUT {{ float4float4 vPositionvPosition :: POSITIONPOSITION 自動生成され挿入されるコード部分自動生成され挿入されるコード部分 //-------------------------------------------------------//------------------------------------------------------- // "VSPIPE_STANDARD.hlsl"// "VSPIPE_STANDARD.hlsl" // VSPIPE_STANDARD// VSPIPE_STANDARD パイプラインのベースシェーダパイプラインのベースシェーダ コードコード #include#include "HLSLDEF.h""HLSLDEF.h" //-------------------------------------------------------//------------------------------------------------------- //// 頂点シェーダ処理頂点シェーダ処理 VS_OUTPUTVS_OUTPUT VS_main(VS_main(VS_INPUTVS_INPUT vIn)vIn) {{ VS_OUTPUTVS_OUTPUT vOut = (vOut = (VS_OUTPUTVS_OUTPUT)0 ;)0 ; #ifdef#ifdef ENABLE_TRANSFORM_HPOSENABLE_TRANSFORM_HPOS vOut.vOut.vPositionvPosition = Transform(vIn.= Transform(vIn.vPositionvPosition) ;) ; #endif#endif // #ifdef ENABLE_TRANSFORM_HPOS// #ifdef ENABLE_TRANSFORM_HPOS #ifdef ENABLE_SETUPTANGENT#ifdef ENABLE_SETUPTANGENT SetupTangent(vIn.vNormal, vIn.vTangent,SetupTangent(vIn.vNormal, vIn.vTangent, vOut.vNormal, vOut.vTangent) ;vOut.vNormal, vOut.vTangent) ; #endif#endif // #ifdef ENABLE_SETUPTANGENT// #ifdef ENABLE_SETUPTANGENT .. .. .. returnreturn vOut ;vOut ; }} ベースとなるシェーダコード部分ベースとなるシェーダコード部分 灰色の部分のコードは処理されない灰色の部分のコードは処理されない
  35. 35. HLSLのコーディングHLSLのコーディング • 決まりはない決まりはない – 自分が判りやすいようにコーディングすれば良い自分が判りやすいようにコーディングすれば良い • 各ファンクションを各ファンクションを HLSLHLSL の関数として記述の関数として記述 – 構造が判りやすくなるのでお勧め構造が判りやすくなるのでお勧め – 各ファンクションを処理する関数各ファンクションを処理する関数 • プリプロセッサ定義の条件を関数の引数とするプリプロセッサ定義の条件を関数の引数とする • 関数内で条件コンパイル関数内で条件コンパイル • 関数の外側から条件コンパイル関数の外側から条件コンパイル • etc.etc. – 各関数を適切な順序でコール各関数を適切な順序でコール
  36. 36. HLSLのコーディング(2)HLSLのコーディング(2) • 後続のファンクションで参照される情報後続のファンクションで参照される情報 – 可能性のある情報は全て計算しておいても良い可能性のある情報は全て計算しておいても良い • 座標座標 • 法線ベクトル法線ベクトル • 反射ベクトル反射ベクトル • etc.etc. – これらを主要な座標系でそれぞれ計算しておくと便これらを主要な座標系でそれぞれ計算しておくと便 利利 • ローカルローカル (( モデリングモデリング )) 座標系座標系 • ワールド座標系ワールド座標系 • カメラ座標系カメラ座標系 • etc.etc. – コンパイル時の最適化で不要なコードは削除されるコンパイル時の最適化で不要なコードは削除される
  37. 37. DCCDCC ツールとの連携ツールとの連携 • 33 DD ツールにパイプライン/ファンクションツールにパイプライン/ファンクション の一部を公開の一部を公開 – プラグインとして提供プラグインとして提供 • メタ言語で動作を定義できると理想的メタ言語で動作を定義できると理想的 – 主にマテリアル関連のファンクションを公開主にマテリアル関連のファンクションを公開 • その他アーティストによる指定が自然と思われるものその他アーティストによる指定が自然と思われるもの • ファンクション構成はパイプラインによって異なるファンクション構成はパイプラインによって異なる • アーティストがパイプラインとフラグメントをアーティストがパイプラインとフラグメントを 選択選択
  38. 38. 設計時に留意すること設計時に留意すること • 拡張性/柔軟性拡張性/柔軟性 – パイプライン/ファンクションなどの追加コストをパイプライン/ファンクションなどの追加コストを できるだけ減らすできるだけ減らす • シェーダは僅かな知識/アイデア/センスがあれば誰でもシェーダは僅かな知識/アイデア/センスがあれば誰でも 書ける書ける • 優れたシェーダ管理機構があれば、容易にアイデアを具現優れたシェーダ管理機構があれば、容易にアイデアを具現 化できる化できる
  39. 39. 組み合わせの発散問題組み合わせの発散問題 アジェンダアジェンダ
  40. 40. 組み合わせの爆発!!組み合わせの爆発!! • 組み合わせは際限無く増える組み合わせは際限無く増える • 指数関数的に増加指数関数的に増加 – 機能ごとに2~4倍ずつ増える機能ごとに2~4倍ずつ増える – 1,0001,000 を超えたらを超えたら 10,00010,000 を超えるのも時間の問題を超えるのも時間の問題 • ではどのくらいの組み合わせが発生するのか?ではどのくらいの組み合わせが発生するのか? – とりあえず思いつくままに列挙とりあえず思いつくままに列挙 • 大雑把に計算してみる大雑把に計算してみる • 合理性/整合性などは無視合理性/整合性などは無視 – …例えば…例えば
  41. 41. 頂点処理の組み合わせ頂点処理の組み合わせ • 頂点アニメーション系の組み合わせ頂点アニメーション系の組み合わせ – インデクス付きスキニングインデクス付きスキニング • 44 種類  (無効/ボーン2~4)種類  (無効/ボーン2~4) – モーフィングモーフィング • 44 種類  (無効/ターゲット2~4)種類  (無効/ターゲット2~4) – 44 ×4 = 16×4 = 16 種類種類 • カラーカラー αα チャネル出力系チャネル出力系 – プライマリカラープライマリカラー • 33 種類  (無効/不透明度/反射率)種類  (無効/不透明度/反射率) – セカンダリカラーセカンダリカラー • 33 種類  (無効/自己発光/遮蔽項)種類  (無効/自己発光/遮蔽項) – 33××3 = 93 = 9 種類種類
  42. 42. 頂点処理の組み合わせ(2)頂点処理の組み合わせ(2) • テクスチャ座標出力系テクスチャ座標出力系 – プライマリテクスチャ座標プライマリテクスチャ座標 • 44 種類 (無効/そのまま出力/UVアニメ/座標から生種類 (無効/そのまま出力/UVアニメ/座標から生 成)成) – セカンダリテクスチャ座標セカンダリテクスチャ座標 • 33 種類  (無効/プライマリ座標と共有/セカンダリ座種類  (無効/プライマリ座標と共有/セカンダリ座 標)標) – シャドウマップテクスチャ座標シャドウマップテクスチャ座標 • 33 種類  (無効/平行投影/スポットライト)種類  (無効/平行投影/スポットライト) – 44××33×3×3 = 36= 36 種類種類
  43. 43. 頂点処理の組み合わせ(3)頂点処理の組み合わせ(3) • 頂点カラー頂点カラー – 55 種類種類  (無効/シャドウ/ディフューズ/スペ  (無効/シャドウ/ディフューズ/スペ キュラー/自己発光)キュラー/自己発光) • 頂点ライティングを行う場合頂点ライティングを行う場合 – ライティング系の組み合わせライティング系の組み合わせ • 平行光源平行光源 – 33 種類  (0~2個)種類  (0~2個) • 点光源点光源 – 33 種類  (0~2個)種類  (0~2個) • 3×3 = 93×3 = 9 種類種類 – 環境マップ環境マップ • 33 種類  (無効/平面反射/キューブマップ)種類  (無効/平面反射/キューブマップ) – 9×9×3 = 273 = 27 種類種類
  44. 44. 頂点処理の組み合わせ数は?頂点処理の組み合わせ数は? • etc.etc. • etc.etc. • etc.etc. • …ここまでの組み合わせ総数は…ここまでの組み合わせ総数は – 頂点ライティングなし(ピクセルライティング等)頂点ライティングなし(ピクセルライティング等) • 1616 ×× 99 ×× 3636 ×× 5=?5=? – 頂点ライティング頂点ライティング • 1616 ×× 99 ×× 3636 ×× 55 ×× 27=?27=?
  45. 45. ピクセル処理の組み合わせピクセル処理の組み合わせ • αα チャネル用途系チャネル用途系 – ベーステクスチャベーステクスチャ αα • 44 種類 (無効/不透明度/グロスマップ/自己発光)種類 (無効/不透明度/グロスマップ/自己発光) – プライマリカラープライマリカラー αα • 33 種類 (無効/不透明度/反射率)種類 (無効/不透明度/反射率) – セカンダリカラーセカンダリカラー αα • 33 種類 (無効/自己発光/遮蔽項)種類 (無効/自己発光/遮蔽項) – 44××33××3 = 363 = 36 種類種類
  46. 46. ピクセル処理の組み合わせピクセル処理の組み合わせ (2)(2) • テクスチャマップ系テクスチャマップ系 – ベーステクスチャベーステクスチャ • 22 種類  (無効/有効)種類  (無効/有効) – 環境マップ環境マップ • 33 種類  (無効/反射率で補間/加算)種類  (無効/反射率で補間/加算) – 屈折環境マップ屈折環境マップ • 22 種類  (無効/有効)種類  (無効/有効) – デティールテクスチャマップデティールテクスチャマップ • 22 種類  (無効/有効)種類  (無効/有効) – 2×2×33×2×2×2×2 == 2424 種類種類
  47. 47. ピクセル処理の組み合わせピクセル処理の組み合わせ (3)(3) • ライトマップ系ライトマップ系 – シャドウマップシャドウマップ • 22 種類 (無効/有効)種類 (無効/有効) – ライトマップライトマップ • 22 種類 (無効/有効)種類 (無効/有効) – 自己発光マップ自己発光マップ • 22 種類 (無効/有効)種類 (無効/有効) – 2×2×22×2×2 == 88 種類種類
  48. 48. ピクセル処理の組み合わせピクセル処理の組み合わせ (4)(4) • ピクセルライティングを行う場合ピクセルライティングを行う場合 – 平行光源平行光源 • 22 種類 (1~2個)種類 (1~2個) – 点光源点光源 • 33 種類 (0~2個)種類 (0~2個) – 環境マップ座標計算環境マップ座標計算 • 33 種類 (無効/平面反射/キューブマップ)種類 (無効/平面反射/キューブマップ) – 22××33××3 = 183 = 18 種類種類
  49. 49. ピクセル処理の組み合わせ数はピクセル処理の組み合わせ数は ?? • etc.etc. • etc.etc. • etc.etc. • …ここまでの組み合わせ総数は…ここまでの組み合わせ総数は – ピクセルライティングなしピクセルライティングなし • 3636 ×× 2424 ×8××8× =?=? – ピクセルライティングピクセルライティング • 3636 ×× 2424 ×8××8× 18=?18=?
  50. 50. 頂点シェーダの組み合わせ数は頂点シェーダの組み合わせ数は ?? • 頂点ライティングなし頂点ライティングなし 1616 ×× 99 ×× 3636 ×× 5=5= 25,92025,920 • 頂点ライティング頂点ライティング 1616 ×× 99 ×× 3636 ×× 55 ×× 27=27= 699,840699,840
  51. 51. ピクセルシェーダの組み合わせ数ピクセルシェーダの組み合わせ数 は?は? • ピクセルライティングなしピクセルライティングなし 3636 ×× 2424 ×8×8 == 6,9126,912 • ピクセルライティングピクセルライティング 3636 ×× 2424 ×8××8× 18=18= 124,416124,416
  52. 52. 組み合わせの爆発問題組み合わせの爆発問題 • …現実的な数ではない…現実的な数ではない – 新しい機能を加えるとさらに数倍ずつ増加してしまう新しい機能を加えるとさらに数倍ずつ増加してしまう • シェーダが増え過ぎるとシェーダが増え過ぎると – メモリを圧迫するメモリを圧迫する – シェーダの切り替えが多くなるシェーダの切り替えが多くなる – シェーダアセンブル/コンパイルに時間がかかるシェーダアセンブル/コンパイルに時間がかかる • 万を超えるシェーダ生成はかなり非効率万を超えるシェーダ生成はかなり非効率 • 本当にそれほど必要か本当にそれほど必要か – 全く使われないシェーダが大半を占める可能性が高い全く使われないシェーダが大半を占める可能性が高い – ほとんどのケースではおそらくほとんどのケースではおそらく 1%1% も使われないも使われない
  53. 53. シェーダを減らすシェーダを減らす アジェンダアジェンダ
  54. 54. 組み合わせ数を減らす組み合わせ数を減らす • 条件をある程度まとめる条件をある程度まとめる – 光源やスキニングは最大数だけを用意光源やスキニングは最大数だけを用意 – 複数のファンクションをまとめて組み合わせを制限複数のファンクションをまとめて組み合わせを制限 • 特殊なシェーダを標準のパイプラインから分離特殊なシェーダを標準のパイプラインから分離 – 独自の処理が多く必要になる特殊なシェーダ独自の処理が多く必要になる特殊なシェーダ • シャドウボリュームシャドウボリューム • 水面水面 • 光学迷彩表現光学迷彩表現 – 一部のファンクションしか必要としないシェーダ一部のファンクションしか必要としないシェーダ • シャドウマップへの描画シャドウマップへの描画
  55. 55. 最大数だけを用意最大数だけを用意 • 光源やスキニングは最大数だけを用意する光源やスキニングは最大数だけを用意する – ライティング系の組み合わせライティング系の組み合わせ • 平行光源平行光源 33 種類(0~2個)種類(0~2個) • 点光源点光源 33 種類(0~2個)種類(0~2個) – 組み合わせ数組み合わせ数 3×3 = 93×3 = 9 種類種類 – これらをこれらを • 平行光源平行光源 22 種類(0または3個)種類(0または3個) • 点光源点光源 22 種類(0または2個)種類(0または2個) – 2×2 = 42×2 = 4 種類に種類に • メモリ量とパフォーマンスから総合的に判断メモリ量とパフォーマンスから総合的に判断 • 可能ならフロー制御(ループ/条件分岐)を活用可能ならフロー制御(ループ/条件分岐)を活用 – フロー制御のパフォーマンスには注意フロー制御のパフォーマンスには注意
  56. 56. 複数ファンクションの統合複数ファンクションの統合 • 関連性の高い複数のファンクションをまとめる関連性の高い複数のファンクションをまとめる – ライティング系の組み合わせライティング系の組み合わせ • 平行光源平行光源 33 種類(0~2個)種類(0~2個) • 点光源点光源 33 種類(0~2個)種類(0~2個) – 組み合わせ数組み合わせ数 3×3 = 93×3 = 9 種類種類 – これらをまとめてこれらをまとめて • 平行光源0+点光源0平行光源0+点光源0 • 平行光源2+点光源1平行光源2+点光源1 • 平行光源4+点光源2平行光源4+点光源2 – 合計で合計で 33 種類種類だけにするだけにする • 可能ならフロー制御を活用可能ならフロー制御を活用
  57. 57. 複数ファンクションの統合複数ファンクションの統合 (2)(2) • マテリアルを一つのファンクションにマテリアルを一つのファンクションに – マテリアルに関わるファンクションを全てまとめるマテリアルに関わるファンクションを全てまとめる • マテリアルファンクションのフラグメント例マテリアルファンクションのフラグメント例 – プラスティックプラスティック – 金属金属 – 肌肌 – アスファルトアスファルト – 水面水面 • ファンクションの組み合わせでマテリアルを表現するよりファンクションの組み合わせでマテリアルを表現するより も組み合わせが減るも組み合わせが減る • マテリアル表現の汎用性は落ちるマテリアル表現の汎用性は落ちる – あまりお勧めはしないあまりお勧めはしない
  58. 58. 標準のパイプラインから分離標準のパイプラインから分離 • 独自の処理が多く必要になる特殊なシェーダ独自の処理が多く必要になる特殊なシェーダ – 例えば例えば • シャドウボリュームシャドウボリューム • 水面水面 • 光学迷彩表現光学迷彩表現 • 別の専用のパイプラインを用意する別の専用のパイプラインを用意する – 標準のパイプラインから不要な機能の組み合わせを標準のパイプラインから不要な機能の組み合わせを 削除できる削除できる • 水面下の屈折処理水面下の屈折処理 • シャドウボリュームの引き伸ばし処理シャドウボリュームの引き伸ばし処理 • 光学迷彩の屈折処理光学迷彩の屈折処理 • etc.etc.
  59. 59. 標準のパイプラインから分離標準のパイプラインから分離 (2)(2) • 一部のファンクションしか必要としないシェー一部のファンクションしか必要としないシェー ダダ – シャドウマップへの描画シャドウマップへの描画 • デプスバッファもしくはカラーへのデプス出力のみデプスバッファもしくはカラーへのデプス出力のみ – アニメーション/座標変換アニメーション/座標変換 – αα テスト用テクスチャテスト用テクスチャ • その他の処理の組み合わせは不要その他の処理の組み合わせは不要 – 環境マップ/ライトマップ/ライティング/環境マップ/ライトマップ/ライティング/ etc.etc. – 標準的なパイプラインに組み込むよりも標準的なパイプラインに組み込むよりも • 構成が判りやすくなり、管理が楽構成が判りやすくなり、管理が楽 • シェーダの組み合わせの無駄を減らし易いシェーダの組み合わせの無駄を減らし易い • そのためにはそのためには – パイプラインを自由に(容易に)追加できる設計にパイプラインを自由に(容易に)追加できる設計に
  60. 60. 無駄なシェーダを生成しない無駄なシェーダを生成しない • 使われるシェーダのみを生成使われるシェーダのみを生成 – 明らかに必要の無い組み合わせは生成しない明らかに必要の無い組み合わせは生成しない • 反射率計算は環境マップとの併用のみ反射率計算は環境マップとの併用のみ – 最終的に全く使われていないコードは削除最終的に全く使われていないコードは削除 • データをスキャンして使用状況をチェックデータをスキャンして使用状況をチェック • シェーダコード数を劇的に減らせる可能性が高いシェーダコード数を劇的に減らせる可能性が高い • 動的に変化する可能性のあるファンクションに注意動的に変化する可能性のあるファンクションに注意 – ライティング/シャドウマップ/ライトマップ環境ライティング/シャドウマップ/ライトマップ環境 – シェーダシェーダ LODLOD などのバリエーションなどのバリエーション – etc.etc. – 最終データ確定までシェーダを確定できない最終データ確定までシェーダを確定できない
  61. 61. シェーダをデータに付属シェーダをデータに付属 • データが作られたときに初めて該当する組み合データが作られたときに初めて該当する組み合 わせを生成するわせを生成する • 動的に変化するファンクションのバリエーショ動的に変化するファンクションのバリエーショ ンも生成ンも生成 • 全体的に無駄が少なくなり、拡張性も高くなる全体的に無駄が少なくなり、拡張性も高くなる がが – パイプライン/ファンクションに変更があると、全パイプライン/ファンクションに変更があると、全 てのデータに対しシェーダの再コンパイルが必要てのデータに対しシェーダの再コンパイルが必要 – シェーダコードが巨大になるとサイズバランスが悪シェーダコードが巨大になるとサイズバランスが悪 いい • 場合によってはシェーダコードがデータの大半を占めてし場合によってはシェーダコードがデータの大半を占めてし
  62. 62. シェーダ生成シェーダ生成 • 多くとも数千個程度に抑えるのが現実的多くとも数千個程度に抑えるのが現実的 • フロー制御が実用的ならかなり節約できるフロー制御が実用的ならかなり節約できる – 現実のフロー制御のパフォーマンスでは厳しいか現実のフロー制御のパフォーマンスでは厳しいか • シェーダはデータに付属させるのが理想?シェーダはデータに付属させるのが理想? – プログラムからできるだけ独立させる方が良いプログラムからできるだけ独立させる方が良い – ただしシェーダに変更が発生すると厄介ただしシェーダに変更が発生すると厄介 • データの再コンバートが必要データの再コンバートが必要
  63. 63. シェーダの管理シェーダの管理 アジェンダアジェンダ
  64. 64. シェーダの管理シェーダの管理 • あるレンダリングに使うシェーダの識別あるレンダリングに使うシェーダの識別 – エフェクトのエフェクトの techniquetechnique に相当するシェーダのペに相当するシェーダのペ アア • パイプライン内のシェーダは通し番号で管理パイプライン内のシェーダは通し番号で管理 – 全組み合わせの通し番号全組み合わせの通し番号 • シェーダ番号、シェーダインデクスシェーダ番号、シェーダインデクス • 通常通常 32 bit32 bit 程度で全シェーダを識別可能程度で全シェーダを識別可能 – パイプラインパイプライン 44 ~~ 5 bit5 bit 程度程度 – 頂点/ピクセルシェーダ各頂点/ピクセルシェーダ各 1111 ~~ 12 bit12 bit 程度程度
  65. 65. シェーダへのアクセスシェーダへのアクセス • 使うシェーダがシェーダ番号で指定された場合使うシェーダがシェーダ番号で指定された場合 – 直接シェーダにアクセスできる直接シェーダにアクセスできる • 任意のフラグメントの組み合わせ指定任意のフラグメントの組み合わせ指定 – 組み合わせから動的にシェーダを決定したい場合組み合わせから動的にシェーダを決定したい場合 • フラグメントの種別からシェーダ番号を容易に確定できるフラグメントの種別からシェーダ番号を容易に確定できる ことこと • シェーダ番号からフラグメント種別の逆引きシェーダ番号からフラグメント種別の逆引き – あるシェーダのフラグメント構成を知りたい場合なあるシェーダのフラグメント構成を知りたい場合な どど • シェーダ番号から各フラグメントの種別を求める必要があシェーダ番号から各フラグメントの種別を求める必要があ るる
  66. 66. シェーダ番号のアタッチシェーダ番号のアタッチ • 例えば例えば – ファンクションファンクション AA はは 44 種類のフラグメントを持つ種類のフラグメントを持つ – ファンクションファンクション BB はは 33 種類のフラグメント種類のフラグメント – ファンクションファンクション CC はは 22 種類種類 – ファンクションファンクション DD はは 44 種類種類 • というファンクションで構成されるパイプライというファンクションで構成されるパイプライ ンン
  67. 67. あるパイプラインの構成あるパイプラインの構成 ファンクションファンクション DD (( fD=0fD=0 ~~ 33 )) ファンクションファンクション CC (( fC=0fC=0 ~~ 11 )) ファンクションファンクション BB (( fB=0fB=0 ~~ 22 )) ファンクションファンクション AA (( fA=0fA=0 ~~ 33 )) B-0B-0 B-1B-1 B-2B-2 C-0C-0 C-1C-1 A-0A-0 A-1A-1 A-2A-2 A-3A-3 D-0D-0 D-1D-1 D-2D-2 D-3D-3 fAfA ~~ fDfD :各フラグメント種別(ゼロから始まる識別番号):各フラグメント種別(ゼロから始まる識別番号)
  68. 68. シェーダ番号のアタッチシェーダ番号のアタッチ B1B1-C0-D0-C0-D0 の組み合わせの組み合わせ fA = 0,1,2,3fA = 0,1,2,3 fB = 1fB = 1 fC = 0fC = 0 fD = 0fD = 0 シェーダシェーダ #6#6 22-1-1-0-0-0-0 A-2A-2 B-1B-1 C-0C-0 D-0D-0 シェーダシェーダ #7#7 33-1-1-0-0-0-0 A-3A-3 B-1B-1 C-0C-0 D-0D-0 シェーダシェーダ #5#5 11-1-1-0-0-0-0 A-1A-1 B-1B-1 C-0C-0 D-0D-0 シェーダシェーダ #4#4 00-1-1-0-0-0-0 A-0A-0 B-1B-1 C-0C-0 D-0D-0 B0B0-C0-D0-C0-D0 の組み合わせの組み合わせ fA = 0,1,2,3fA = 0,1,2,3 fB = 0fB = 0 fC = 0fC = 0 fD = 0fD = 0 シェーダシェーダ #0#0 00-0-0-0-0-0-0 A-0A-0 B-0B-0 C-0C-0 D-0D-0 シェーダシェーダ #1#1 11-0-0-0-0-0-0 A-1A-1 B-0B-0 C-0C-0 D-0D-0 シェーダシェーダ #2#2 22-0-0-0-0-0-0 A-2A-2 B-0B-0 C-0C-0 D-0D-0 シェーダシェーダ #3#3 33-0-0-0-0-0-0 A-3A-3 B-0B-0 C-0C-0 D-0D-0
  69. 69. シェーダ番号のアタッチ(2)シェーダ番号のアタッチ(2) • シェーダの通し番号をアタッチシェーダの通し番号をアタッチ – フラグメントの組み合わせと通し番号を対応付けるフラグメントの組み合わせと通し番号を対応付ける • Index = fD×Index = fD× (4(4 ×× 33 ×× 2)+2)+ fC×fC× (4(4 ×× 3)+3)+ fB×fB× (( 44 )+)+ fAfA – IndexIndex はシェーダ番号(通し番号)はシェーダ番号(通し番号) – fAfA ~~ fDfD は各フラグメント種別(ゼロから始まる識別番号)は各フラグメント種別(ゼロから始まる識別番号) • 96(496(4 ×× 33 ×× 22 ×× 4)通りの番号(0~95)がユニー4)通りの番号(0~95)がユニー クに定まるクに定まる – 計算負荷計算負荷 • 乗算:ファンクション数-1乗算:ファンクション数-1 • 加算:ファンクション数加算:ファンクション数
  70. 70. フラグメント種別の逆引きフラグメント種別の逆引き • フラグメント種別の逆引きフラグメント種別の逆引き – シェーダ番号から各フラグメント種別を計算シェーダ番号から各フラグメント種別を計算 • fD = IndexfD = Index /(4/(4 ×× 33 ×× 2)2) , rem = Index %, rem = Index % (4(4 ×× 33 ×× 2)2) • fC = remfC = rem // (( 44 ×× 33 ), rem = rem %), rem = rem % (4(4 ×× 3)3) • fB = remfB = rem /(4)/(4) , rem = rem %, rem = rem % (4)(4) • fA = remfA = rem – IndexIndex はシェーダ番号(この例では0~95)はシェーダ番号(この例では0~95) – fAfA ~~ fDfD は各フラグメント種別(ゼロから始まる識別番号)は各フラグメント種別(ゼロから始まる識別番号) – 計算負荷計算負荷 • 剰余/除算のペア:ファンクション数-1剰余/除算のペア:ファンクション数-1 – テーブルを使うテーブルを使う • 組み合わせ数組み合わせ数 ×× ファンクション数の配列(96ファンクション数の配列(96 ×× 4=384=38 4要素)4要素) – ファンクション毎にフラグメント種別を保持するファンクション毎にフラグメント種別を保持する – 各要素は通常各要素は通常 8-bit8-bit で充分(フラグメント種別を識別)で充分(フラグメント種別を識別)
  71. 71. テーブルを使うかテーブルを使うか • 計算で求めるかテーブルを使うか計算で求めるかテーブルを使うか – テーブルサイズや使用頻度によって総合的に判断テーブルサイズや使用頻度によって総合的に判断 • メモリキャッシュも意識しておくメモリキャッシュも意識しておく • 使用頻度が高い使用頻度が高い – テーブルを使った方が効率が良い可能性が高いテーブルを使った方が効率が良い可能性が高い • キャッシュヒットしやすいキャッシュヒットしやすい • 使用頻度が低い使用頻度が低い – 計算した方がトータルで効率が良い可能性が高い計算した方がトータルで効率が良い可能性が高い • たとえ計算が遅くても使用頻度が低ければ問題にならないたとえ計算が遅くても使用頻度が低ければ問題にならない • キャッシュヒットしにくいキャッシュヒットしにくい • 組み合わせが多い場合はメモリを節約できる組み合わせが多い場合はメモリを節約できる
  72. 72. 実装例実装例 アジェンダアジェンダ ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING
  73. 73. アセンブリでの実装例アセンブリでの実装例 • XboxXbox • シェーダバージョンシェーダバージョン – 1.11.1 ~~ 1.31.3 相当相当 – 全てアセンブリで記述全てアセンブリで記述 – プリプロセッサによる条件アセンブルでコードを制プリプロセッサによる条件アセンブルでコードを制 御御 • 用途別にいくつかのパイプラインを作成用途別にいくつかのパイプラインを作成 – 標準的なパイプライン標準的なパイプライン – 夜の標準的なパイプライン夜の標準的なパイプライン – シャドウマップ描画用パイプラインシャドウマップ描画用パイプライン – 光学迷彩マテリアル用パイプライン光学迷彩マテリアル用パイプライン ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING
  74. 74. シェーダ数シェーダ数 • 頂点シェーダの組み合わせ頂点シェーダの組み合わせ – 組み合わせ総数組み合わせ総数 18061806 – 実際に生成される有効な組み合わせ実際に生成される有効な組み合わせ 17161716 • ピクセルシェーダの組み合わせピクセルシェーダの組み合わせ – 組み合わせ総数組み合わせ総数 436436 – 実際に生成される有効な組み合わせ実際に生成される有効な組み合わせ 244244 • 無駄なコードも残っている無駄なコードも残っている – 最終的に使われないコードも含まれている最終的に使われないコードも含まれている • 自動生成しないシェーダ自動生成しないシェーダ – フルシーンエフェクト/パーティクルなどフルシーンエフェクト/パーティクルなど – パーティクルは少数の組み合わせを手作業で作成パーティクルは少数の組み合わせを手作業で作成 – 合計で合計で数十程度数十程度 ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING
  75. 75. コード(一部の抜粋)コード(一部の抜粋) • メタ言語による定義メタ言語による定義 – パイプラインパイプライン – ファンクションファンクション – フラグメントフラグメント • シェーダコードシェーダコード – パイプライン共通のシェーダコードパイプライン共通のシェーダコード – シェーダファンクションサンプルシェーダファンクションサンプル • それぞれ頂点/ピクセルシェーダ用それぞれ頂点/ピクセルシェーダ用 ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING
  76. 76. 頂点パイプライン定義頂点パイプライン定義 ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING //--------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------- //// 頂点シェーダパイプライン定義頂点シェーダパイプライン定義 //// 標準的なパイプライン標準的なパイプライン vs_pipevs_pipe VSPIPE_STANDARDVSPIPE_STANDARD {{ codecode VSPIPE_STANDARD.hVSPIPE_STANDARD.h //// 当該パイプラインで共通のコード部当該パイプラインで共通のコード部 //// パイプラインのファンクションパイプラインのファンクション VSFUNC_ANIMATIONVSFUNC_ANIMATION VSFUNC_TRANSFORMVSFUNC_TRANSFORM VSFUNC_VERTEXCOLORVSFUNC_VERTEXCOLOR VSFUNC_LIGHTINGVSFUNC_LIGHTING VSFUNC_TEX_2NDVSFUNC_TEX_2ND //// ライトマップ/ディティールマップ等ライトマップ/ディティールマップ等 VSFUNC_TEX_SHADOWMAPVSFUNC_TEX_SHADOWMAP VSFUNC_TEX_ENVMAPVSFUNC_TEX_ENVMAP //// 環境マップ座標生成/マテリアル制御環境マップ座標生成/マテリアル制御 VSFUNC_OUTD0ALPHAVSFUNC_OUTD0ALPHA // oD0// oD0 出力制御出力制御 (( 輝度輝度 )) }} //// 屈折レンダリングパイプライン屈折レンダリングパイプライン vs_pipevs_pipe VSPIPE_REFRACTIONVSPIPE_REFRACTION {{ codecode VSPIPE_REFRACTION.hVSPIPE_REFRACTION.h //// 当該パイプラインで共通のコード部当該パイプラインで共通のコード部 VSFUNC_ANIMATIONVSFUNC_ANIMATION VSFUNC_TRANSFORMVSFUNC_TRANSFORM }} //// シャドウマップ生成用パイプラインシャドウマップ生成用パイプライン vs_pipevs_pipe VSPIPE_SHADOWMAPVSPIPE_SHADOWMAP {{ codecode VSPIPE_STD_SHADOWMAP.hVSPIPE_STD_SHADOWMAP.h //// 当該パイプラインで共通のコード部当該パイプラインで共通のコード部 VSFUNC_ANIMATIONVSFUNC_ANIMATION VSFUNC_TRANSFORMVSFUNC_TRANSFORM }}
  77. 77. ピクセルパイプライン定義ピクセルパイプライン定義 ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING //--------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------- //// ピクセルシェーダパイプライン定義ピクセルシェーダパイプライン定義 //// 昼レンダーモード用の標準的なパイプライン昼レンダーモード用の標準的なパイプライン ps_pipeps_pipe PSPIPE_STANDARDPSPIPE_STANDARD {{ defdef #define PS_DAYTIME#define PS_DAYTIME //// 昼間設定昼間設定 defdef PSPIPE_STANDARD_DEF.hPSPIPE_STANDARD_DEF.h //// 当該パイプラインで共通の宣言部当該パイプラインで共通の宣言部 (tex/def(tex/def 等等 )) codecode PSPIPE_STANDARD.hPSPIPE_STANDARD.h //// 当該パイプラインで共通のコード部当該パイプラインで共通のコード部 //// パイプラインのファンクションパイプラインのファンクション PSFUNC_TEX_BASEPSFUNC_TEX_BASE PSFUNC_TEX_2NDPSFUNC_TEX_2ND // 2// 2 番目のテクスチャ使用番目のテクスチャ使用 PSFUNC_TEX_SHADOWMAPPSFUNC_TEX_SHADOWMAP PSFUNC_TEX_ENVPSFUNC_TEX_ENV PSFUNC_TEX_BASEALPHAPSFUNC_TEX_BASEALPHA //// ベーステクスチャベーステクスチャ αα 使用法使用法 PSFUNC_OPACITYPSFUNC_OPACITY //// 半透明描画の場合に別の専用処理をす半透明描画の場合に別の専用処理をす る場合の種別る場合の種別 }} //// シャドウマップ作成レンダーモード用パイプラインシャドウマップ作成レンダーモード用パイプライン ps_pipeps_pipe PSPIPE_SHADOWMAPPSPIPE_SHADOWMAP {{ codecode PSPIPE_STD_SHADOWMAP.hPSPIPE_STD_SHADOWMAP.h //// 当該パイプラインで共通のコード部当該パイプラインで共通のコード部 PSFUNC_SHMAP_TEX_BASEALPHAPSFUNC_SHMAP_TEX_BASEALPHA //// ベーステクスチャベーステクスチャ αα を不透明度としてを不透明度として 利用するか利用するか }} //// 屈折レンダリングパイプライン屈折レンダリングパイプライン ps_pipeps_pipe PSPIPE_REFRACTIONPSPIPE_REFRACTION {{ codecode PSPIPE_STD_REFRACTION.hPSPIPE_STD_REFRACTION.h //// 当該パイプラインで共通のコード部当該パイプラインで共通のコード部 PSFUNC_SHMAP_TEX_BASEALPHAPSFUNC_SHMAP_TEX_BASEALPHA //// ベースベース αα を不透明度として利用するかを不透明度として利用するか }}
  78. 78. 頂点ファンクション頂点ファンクション定義定義 ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING //--------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------- //// 頂点シェーダパイプライン内の各機能の種別定義頂点シェーダパイプライン内の各機能の種別定義 //// 頂点圧縮解凍/アニメーション頂点圧縮解凍/アニメーション vs_functionvs_function VSFUNC_ANIMATIONVSFUNC_ANIMATION {{ VSFRG_ANM_NONEVSFRG_ANM_NONE VSFRG_ANM_WINDSWAYVSFRG_ANM_WINDSWAY //// 風による揺れアニメーション風による揺れアニメーション VSFRG_ANM_SKIN_WGT4_PVSFRG_ANM_SKIN_WGT4_P //// 行列パレットスキニング行列パレットスキニング (( ウェイトウェイト 4)4) }} //// 座標変換座標変換 vs_functionvs_function VSFUNC_TRANSFORMVSFUNC_TRANSFORM {{ VSFRG_XFORM_WVPVSFRG_XFORM_WVP //// 通常のワールド/ビュー/プロジェクション変換通常のワールド/ビュー/プロジェクション変換 }} //// 頂点カラー情報頂点カラー情報 vs_functionvs_function VSFUNC_VERTEXCOLORVSFUNC_VERTEXCOLOR {{ VSFRG_VCOLOR_NONEVSFRG_VCOLOR_NONE //// 頂点カラーなし頂点カラーなし }} //// ライティング種別ライティング種別 vs_functionvs_function VSFUNC_LIGHTINGVSFUNC_LIGHTING {{ //// 半球ライティング+半球ライティング+ VSFRG_LIT_D2VSFRG_LIT_D2 //// 平行光源平行光源 22 個個 VSFRG_LIT_D3VSFRG_LIT_D3 //// 平行光源平行光源 33 個個 VSFRG_LIT_D4VSFRG_LIT_D4 //// 平行光源平行光源 44 個個 VSFRG_LIT_D2_P1VSFRG_LIT_D2_P1 //// 平行光源平行光源 33 個個 ++ 点光源点光源 11 個個 VSFRG_LIT_D2_P2VSFRG_LIT_D2_P2 //// 平行光源平行光源 22 個個 ++ 点光源点光源 22 個個 }} //// ライトマップ/ディティールテクスチャマップ種別ライトマップ/ディティールテクスチャマップ種別 vs_functionvs_function VSFUNC_TEX_2NDVSFUNC_TEX_2ND {{ VSFRG_TEX_2ND_NONEVSFRG_TEX_2ND_NONE //// セカンダリテクスチャなしセカンダリテクスチャなし VSFRG_TEX_2ND_TEXCOORD0VSFRG_TEX_2ND_TEXCOORD0 //// ベーステクスチャと同じ座標を出力ベーステクスチャと同じ座標を出力 VSFRG_TEX_2ND_TEXCOORD1VSFRG_TEX_2ND_TEXCOORD1 //// テクスチャ座標テクスチャ座標 22 を使用を使用 VSFRG_TEX_2ND_M42_UVVSFRG_TEX_2ND_M42_UV //// 変換行列による頂点座標変換を使用変換行列による頂点座標変換を使用 (4x2(4x2 行列で行列で uvuv 出力出力 )) }}
  79. 79. 頂点ファンクション頂点ファンクション定義(2)定義(2) ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING //// シャドウマップテクスチャ座標シャドウマップテクスチャ座標 vs_functionvs_function VSFUNC_TEX_SHADOWMAPVSFUNC_TEX_SHADOWMAP {{ VSFRG_TEX_SHADOW_NONEVSFRG_TEX_SHADOW_NONE //// シャドウマップ出力なしシャドウマップ出力なし VSFRG_TEX_SHADOW_M44_UVWQVSFRG_TEX_SHADOW_M44_UVWQ //// シャドウマップテクスチャ座標出力シャドウマップテクスチャ座標出力 (4x4(4x4 射影行射影行 列で列で uvwquvwq 出力出力 )) VSFRG_TEX_SHADOW_M44_UVWQ_SPOTLIGHTVSFRG_TEX_SHADOW_M44_UVWQ_SPOTLIGHT //// スポットシェーディング付きライトマップテクスポットシェーディング付きライトマップテク スチャ座標出力スチャ座標出力 // (4x4// (4x4 射影行列で射影行列で uvwquvwq 出力出力 )) }} //// 環境マップテクスチャ座標環境マップテクスチャ座標 //// 環境マップおよびマテリアル制御環境マップおよびマテリアル制御 vs_functionvs_function VSFUNC_TEX_ENVMAPVSFUNC_TEX_ENVMAP {{ VSFRG_TEX_ENV_NONEVSFRG_TEX_ENV_NONE //// 環境マップなし/ライティングは通常のディフューズ環境マップなし/ライティングは通常のディフューズ VSFRG_TEX_ENV_NONE_MATRL_CONSTANTCOLORVSFRG_TEX_ENV_NONE_MATRL_CONSTANTCOLOR //// 環境マップなし/定数カラーマテリアル環境マップなし/定数カラーマテリアル VSFRG_TEX_ENV_NONE_MATRL_FIXEDDIFFUSEVSFRG_TEX_ENV_NONE_MATRL_FIXEDDIFFUSE //// 環境マップなし/固定シェードライティング環境マップなし/固定シェードライティング (( ビビ ルボードルボード etc.)etc.) VSFRG_TEX_ENV_DYNANICVSFRG_TEX_ENV_DYNANIC //// 動的キューブマッピング動的キューブマッピング VSFRG_TEX_ENV_DYNANIC_APPROXLOCALVSFRG_TEX_ENV_DYNANIC_APPROXLOCAL //// 動的キューブマッピング動的キューブマッピング (( 反射ベクトルのローカル近似補正あ反射ベクトルのローカル近似補正あ りり )) VSFRG_TEX_ENV_DYNANIC_FIXEDREFVSFRG_TEX_ENV_DYNANIC_FIXEDREF //// 動的キューブマッピング動的キューブマッピング (( 反射率固定反射率固定 )) VSFRG_TEX_ENV_STATICVSFRG_TEX_ENV_STATIC //// 静的キューブマッピング静的キューブマッピング (( ワールドスペースワールドスペース )) VSFRG_TEX_ENV_STATIC_FIXEDREFVSFRG_TEX_ENV_STATIC_FIXEDREF //// 静的キューブマッピング静的キューブマッピング (( 反射率固定反射率固定 )) VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2 //// 動的キューブマッピング/メタリックツートン動的キューブマッピング/メタリックツートン カラーカラー VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCALVSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCAL //// 動的キューブマッピング/メタリックツー動的キューブマッピング/メタリックツー トンカラートンカラー // (// ( 反射ベクトルのローカル近似補正あり反射ベクトルのローカル近似補正あり )) }} // oD0// oD0 出力制御出力制御 (( 輝度輝度 )) vs_functionvs_function VSFUNC_OUTD0ALPHAVSFUNC_OUTD0ALPHA {{
  80. 80. ピクセルファンクションピクセルファンクション定義定義 //--------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------- //// ピクセルシェーダパイプライン内の各機能の種別定義ピクセルシェーダパイプライン内の各機能の種別定義 //// ベーステクスチャマップファンクションベーステクスチャマップファンクション ps_functionps_function PSFUNC_TEX_BASEPSFUNC_TEX_BASE {{ PSFRG_TEX_BASE_DIFFUSEPSFRG_TEX_BASE_DIFFUSE //// ベーステクスチャのディフューズモデュレートベーステクスチャのディフューズモデュレート }} // 2// 2 番目のテクスチャマップファンクション番目のテクスチャマップファンクション ps_functionps_function PSFUNC_TEX_2NDPSFUNC_TEX_2ND {{ PSFRG_TEX_2ND_NONEPSFRG_TEX_2ND_NONE // 2// 2 番目のテクスチャなし番目のテクスチャなし PSFRG_TEX_2ND_MODULATEPSFRG_TEX_2ND_MODULATE // 2// 2 番目のテクスチャはベーステクスチャのモデュレーション番目のテクスチャはベーステクスチャのモデュレーション (( ディティールディティール 等等 )) PSFRG_TEX_2ND_LIGHTMAPPSFRG_TEX_2ND_LIGHTMAP // 2// 2 番目のテクスチャは焼付けライトマップ番目のテクスチャは焼付けライトマップ }} //// シャドウマップファンクションシャドウマップファンクション ps_functionps_function PSFUNC_TEX_SHADOWMAPPSFUNC_TEX_SHADOWMAP {{ PSFRG_TEX_SHADOWMAP_NONEPSFRG_TEX_SHADOWMAP_NONE //// シャドウマップなしシャドウマップなし PSFRG_TEX_SHADOWMAP_SHADOWMAPPSFRG_TEX_SHADOWMAP_SHADOWMAP //// シャドウマップシャドウマップ }} //// 環境テクスチャマップファンクション環境テクスチャマップファンクション ps_functionps_function PSFUNC_TEX_ENVPSFUNC_TEX_ENV {{ PSFRG_TEX_ENV_NONEPSFRG_TEX_ENV_NONE //// 環境マップテクスチャなし環境マップテクスチャなし PSFRG_TEX_ENV_REFLECTPSFRG_TEX_ENV_REFLECT // (// ( フレネルフレネル )) 反射率による反射環境マップ反射率による反射環境マップ FRG_TEX_ENV_ADDFRG_TEX_ENV_ADD //// 加算環境マップ加算環境マップ }} ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING
  81. 81. ピクセルファンクションピクセルファンクション定義定義 (2)(2)//// ベーステクスチャベーステクスチャ αα 使用法使用法 ps_functionps_function PSFUNC_TEX_BASEALPHAPSFUNC_TEX_BASEALPHA {{ PSFRG_TEX_BA_NONEPSFRG_TEX_BA_NONE //// ベーステクスチャベーステクスチャ αα は無視は無視 PSFRG_TEX_BA_OPACITYPSFRG_TEX_BA_OPACITY //// ベーステクスチャベーステクスチャ αα は不透明度として利用は不透明度として利用 PSFRG_TEX_BA_GLOSSPSFRG_TEX_BA_GLOSS //// ベーステクスチャベーステクスチャ αα はグロスはグロス (( 反射率反射率 )) として利用として利用 PSFRG_TEX_BA_OPACITY_INVGLOSSPSFRG_TEX_BA_OPACITY_INVGLOSS //// ベースベース αα は不透明度と補数グロスは不透明度と補数グロス (1-(1- 反射率反射率 )) として利用として利用 PSFRG_TEX_BA_ILLUMPSFRG_TEX_BA_ILLUM //// ベーステクスチャベーステクスチャ αα は自己照明度として利用は自己照明度として利用 (α(α ブレンド有効時は不透明ブレンド有効時は不透明 兼兼 )) PSFRG_TEX_BA_ILLUM_INVGLOSSPSFRG_TEX_BA_ILLUM_INVGLOSS //// ベースベース αα は自己照明度と補数グロスは自己照明度と補数グロス (1-(1- 反射率反射率 )) として利として利 用用 }} //// 半透明描画の場合に別の専用処理をする場合の種別半透明描画の場合に別の専用処理をする場合の種別 //// //// ガラスマテリアルはガラスマテリアルは // PSFRG_OPAC_GLASS_TM// PSFRG_OPAC_GLASS_TM として設定されるとして設定される // 2// 2 パス処理を行う場合はパス処理を行う場合は 22 パス目をパス目を PSFRG_OPAC_NONEPSFRG_OPAC_NONE に修正してレンダリングするに修正してレンダリングする ps_functionps_function PSFUNC_OPACITYPSFUNC_OPACITY {{ PSFRG_OPAC_NONEPSFRG_OPAC_NONE //// 通常の不透明もしくは半透明でも共通に利用できるマテリ通常の不透明もしくは半透明でも共通に利用できるマテリ アルアル PSFRG_OPAC_GLASS_TMPSFRG_OPAC_GLASS_TM //// ガラスガラス (( 半透明環境マップ半透明環境マップ )) のシングルパス描画のシングルパス描画 (( トーンマップ処理まで行トーンマップ処理まで行 うう )) }} //--------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------- //// シャドウ/屈折ピクセルシェーダパイプライン内各機能の種別定義シャドウ/屈折ピクセルシェーダパイプライン内各機能の種別定義 //// ベーステクスチャベーステクスチャ αα 使用法使用法 ps_functionps_function PSFUNC_SHMAP_TEX_BASEALPHAPSFUNC_SHMAP_TEX_BASEALPHA {{ PSFRG_SHMAP_TEX_BA_NONEPSFRG_SHMAP_TEX_BA_NONE //// ベーステクスチャベーステクスチャ αα は無視は無視 PSFRG_SHMAP_TEX_BA_OPACITYPSFRG_SHMAP_TEX_BA_OPACITY //// シャドウシャドウ αα テストにベーステクスチャテストにベーステクスチャ αα を不透明度としてを不透明度として 出力出力 //// 屈折屈折 αα キル用テクスチャフェッチキル用テクスチャフェッチ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING
  82. 82. 頂点フラグメント定義頂点フラグメント定義 //------------------------------------------------------------------//------------------------------------------------------------------ //// 頂点シェーダファンクション頂点シェーダファンクション (( 機能機能 )) 毎の実際の機能フラグメント定義毎の実際の機能フラグメント定義 //// //------------------------------------------------//------------------------------------------------ // VSFUNC_LIGHTING :// VSFUNC_LIGHTING : ライティングフラグメントライティングフラグメント //// 半球ライティング半球ライティング ++ //// プライマリライティングとして平行光源プライマリライティングとして平行光源 11 個個 ++ //// 追加平行光源追加平行光源 11 個個 vs_fragmentvs_fragment VSFRG_LIT_D2VSFRG_LIT_D2 {{ defdef #define LIT_NUM_ADDITIVE_LIGHTS_1#define LIT_NUM_ADDITIVE_LIGHTS_1 }} //// 半球ライティング半球ライティング ++ //// プライマリライティングとして平行光源プライマリライティングとして平行光源 11 個個 ++ //// 追加平行光源追加平行光源 11 個個 ++ 追加平行光源追加平行光源 11 個個 vs_fragmentvs_fragment VSFRG_LIT_D3VSFRG_LIT_D3 {{ defdef #define LIT_NUM_ADDITIVE_LIGHTS_2#define LIT_NUM_ADDITIVE_LIGHTS_2 }} //// 半球ライティング半球ライティング ++ //// プライマリライティングとして平行光源プライマリライティングとして平行光源 11 個個 ++ //// 追加平行光源追加平行光源 11 個個 ++ 追加平行光源追加平行光源 22 個個 vs_fragmentvs_fragment VSFRG_LIT_D4VSFRG_LIT_D4 {{ defdef #define LIT_NUM_ADDITIVE_LIGHTS_3#define LIT_NUM_ADDITIVE_LIGHTS_3 }} ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING //// 半球ライティング半球ライティング ++ //// プライマリライティングとして平行光源プライマリライティングとして平行光源 11 個個 ++ //// 追加平行光源追加平行光源 11 個個 ++ 追加点光源追加点光源 11 個個 vs_fragmentvs_fragment VSFRG_LIT_D2_P1VSFRG_LIT_D2_P1 {{ defdef #define#define LIT_NUM_ADDITIVE_LIGHTS_2LIT_NUM_ADDITIVE_LIGHTS_2 //// 追加光源の最後の追加光源の最後の 11 つは点光源につは点光源に defdef #define LIT_ADDITIVE_2_POINT#define LIT_ADDITIVE_2_POINT }} //// 半球ライティング半球ライティング ++ //// プライマリライティングとして平行光源プライマリライティングとして平行光源 11 個個 ++ //// 追加平行光源追加平行光源 11 個個 ++ 追加点光源追加点光源 22 個個 vs_fragmentvs_fragment VSFRG_LIT_D2_P2VSFRG_LIT_D2_P2 {{ defdef #define#define LIT_NUM_ADDITIVE_LIGHTS_3LIT_NUM_ADDITIVE_LIGHTS_3 //// 追加光源の最後の追加光源の最後の 22 つは点光源につは点光源に defdef #define LIT_ADDITIVE_2_POINT#define LIT_ADDITIVE_2_POINT defdef #define LIT_ADDITIVE_3_POINT#define LIT_ADDITIVE_3_POINT }}
  83. 83. 頂点フラグメント定義(2)頂点フラグメント定義(2) ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING //------------------------------------------------//------------------------------------------------ // VSFUNC_TEX_2ND :// VSFUNC_TEX_2ND : ライトマップ/ディティールマップ種ライトマップ/ディティールマップ種 別別 //// セカンダリテクスチャ座標なしセカンダリテクスチャ座標なし vs_fragmentvs_fragment VSFRG_TEX_2ND_NONEVSFRG_TEX_2ND_NONE {{ }} //// セカンダリテクスチャ座標にベーステクスチャと同じ座標をセカンダリテクスチャ座標にベーステクスチャと同じ座標を 出力出力 vs_fragmentvs_fragment VSFRG_TEX_2ND_TEXCOORD0VSFRG_TEX_2ND_TEXCOORD0 {{ defdef #define#define VS_TEX_2ND_TEXCOORD0VS_TEX_2ND_TEXCOORD0 }} //// セカンダリテクスチャ座標にセカンダリテクスチャ座標に 22 番目のテクスチャ座標を出番目のテクスチャ座標を出 力力 vs_fragmentvs_fragment VSFRG_TEX_2ND_TEXCOORD1VSFRG_TEX_2ND_TEXCOORD1 {{ defdef #define#define VS_TEX_2ND_TEXCOORD1VS_TEX_2ND_TEXCOORD1 }} //// モデル系頂点座標をモデル系頂点座標を 4x24x2 行列で変換した行列で変換した uvuv 座標を出力座標を出力 vs_fragmentvs_fragment VSFRG_TEX_2ND_M42_UVVSFRG_TEX_2ND_M42_UV {{ defdef #define VS_TEX_2ND_M42_UV#define VS_TEX_2ND_M42_UV }} //------------------------------------------------//------------------------------------------------ // VSFUNC_TEX_SHADOWMAP :// VSFUNC_TEX_SHADOWMAP : シャドウマップテクスチャ座標シャドウマップテクスチャ座標 //// シャドウマップテクスチャ座標生成なしシャドウマップテクスチャ座標生成なし vs_fragmentvs_fragment VSFRG_TEX_SHADOW_NONEVSFRG_TEX_SHADOW_NONE {{ }} //// モデル系頂点座標をモデル系頂点座標を 4x44x4 行列で変換した行列で変換した uvwquvwq 座標を出力座標を出力 vs_fragmentvs_fragment VSFRG_TEX_SHADOW_M44_UVWQVSFRG_TEX_SHADOW_M44_UVWQ {{ defdef #define VS_TEX_SHADOW_M44_UVWQ#define VS_TEX_SHADOW_M44_UVWQ }} //// スポットライトマップテクスチャ座標出力スポットライトマップテクスチャ座標出力 (4x4(4x4 射影行列で射影行列で uvwquvwq 出出 力力 )) //// ライティング処理によるライティング処理による ww 座標の補正等が入る座標の補正等が入る vs_fragmentvs_fragment VSFRG_TEX_SHADOW_M44_UVWQ_SPOTLIGHTVSFRG_TEX_SHADOW_M44_UVWQ_SPOTLIGHT {{ defdef #define#define VS_TEX_SHADOW_M44_UVWQ_SPOTLIGHTVS_TEX_SHADOW_M44_UVWQ_SPOTLIGHT }}
  84. 84. 頂点フラグメント定義(3)頂点フラグメント定義(3) ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING //------------------------------------------------//------------------------------------------------ // VSFUNC_TEX_ENVMAP :// VSFUNC_TEX_ENVMAP : 環境マップテクスチャ座標/マテリアル環境マップテクスチャ座標/マテリアル 制御制御 //// 環境マップなし/ライティングは通常のディフューズ環境マップなし/ライティングは通常のディフューズ vs_fragmentvs_fragment VSFRG_TEX_ENV_NONEVSFRG_TEX_ENV_NONE {{ }} //// 環境マップなし/ダイレクトカラーマテリアル環境マップなし/ダイレクトカラーマテリアル vs_fragmentvs_fragment VSFRG_TEX_ENV_NONE_MATRL_CONSTANTCOLORVSFRG_TEX_ENV_NONE_MATRL_CONSTANTCOLOR {{ defdef #define#define VS_MATRL_CONSTANTCOLORVS_MATRL_CONSTANTCOLOR !disable!disable VSFRG_TEX_SHADOW_NONEVSFRG_TEX_SHADOW_NONE //// シャドウ無シャドウ無 効効 //// セカンダリテクスチャ無効セカンダリテクスチャ無効 !disable!disable VSFRG_TEX_2ND_NONEVSFRG_TEX_2ND_NONE }} //// 環境マップなし/固定シェードライティング環境マップなし/固定シェードライティング (( ビルボードビルボード etc.)etc.) vs_fragmentvs_fragment VSFRG_TEX_ENV_NONE_MATRL_FIXEDDIFFUSEVSFRG_TEX_ENV_NONE_MATRL_FIXEDDIFFUSE {{ defdef #define VS_MATRL_FIXEDDIFFUSE#define VS_MATRL_FIXEDDIFFUSE }} //// 動的環境マッピング動的環境マッピング vs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANICVSFRG_TEX_ENV_DYNANIC {{ defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBE }} //// 動的環境マッピング動的環境マッピング (( 反射ベクトルのローカル近似補正あり反射ベクトルのローカル近似補正あり )) vs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC_APPROXLOCALVSFRG_TEX_ENV_DYNANIC_APPROXLOCAL {{ defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBE defdef #define XFORM_ADJUST_ENV_REF#define XFORM_ADJUST_ENV_REF }} //// 動的環境マッピング動的環境マッピング (( 反射率固定反射率固定 )) vs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC_FIXEDREFVSFRG_TEX_ENV_DYNANIC_FIXEDREF {{ defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBE defdef #define#define //// 静的環境マッピング静的環境マッピング vs_fragmentvs_fragment VSFRG_TEX_ENV_STATICVSFRG_TEX_ENV_STATIC {{ defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBE //// 静的キューブマップは固定反射率静的キューブマップは固定反射率 (( フレネル無効フレネル無効 )) にする?にする? //// defdef #define VS_TEX_ENV_FIXEDREFLECTANCE#define VS_TEX_ENV_FIXEDREFLECTANCE }} //// キューブマッピングキューブマッピング (( 反射率固定反射率固定 )) vs_fragmentvs_fragment VSFRG_TEX_ENV_STATIC_FIXEDREFVSFRG_TEX_ENV_STATIC_FIXEDREF {{ defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBE defdef #define VS_TEX_ENV_FIXEDREFLECTANCE#define VS_TEX_ENV_FIXEDREFLECTANCE }} //// スフィアマッピング/メタリックツートンカラースフィアマッピング/メタリックツートンカラー vs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2 {{ defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBE defdef #define VS_MATRL_2TONE#define VS_MATRL_2TONE defdef #define VS_MATRL_METALLIC#define VS_MATRL_METALLIC !disable!disable VSFRG_VCOLOR_NONEVSFRG_VCOLOR_NONE //// 頂点カラー無しのみ頂点カラー無しのみ }} //// スフィアマッピング/メタリックツートンカラースフィアマッピング/メタリックツートンカラー //// 反射ベクトルのローカル反射用近似用補正あり反射ベクトルのローカル反射用近似用補正あり vs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCALVSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCAL {{ defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBE defdef #define VS_MATRL_2TONE#define VS_MATRL_2TONE defdef #define VS_MATRL_METALLIC#define VS_MATRL_METALLIC !disable!disable VSFRG_VCOLOR_NONEVSFRG_VCOLOR_NONE //// 頂点カラー無しのみ頂点カラー無しのみ //// 反射ベクトルを近似補正する反射ベクトルを近似補正する defdef #define XFORM_ADJUST_ENV_REF#define XFORM_ADJUST_ENV_REF }}
  85. 85. ピクセルフラグメント定義ピクセルフラグメント定義 //-----------------------------------------------------------------------//----------------------------------------------------------------------- //// ピクセルシェーダファンクションピクセルシェーダファンクション (( 機能機能 )) 毎の実際の機能フラグメント定毎の実際の機能フラグメント定 義義 //// //------------------------------------------------//------------------------------------------------ // PSFUNC_TEX_BASE :// PSFUNC_TEX_BASE : ベーステクスチャピクセルシェーダフラグメントベーステクスチャピクセルシェーダフラグメント //// ベーステクスチャのディフューズモデュレートベーステクスチャのディフューズモデュレート ps_fragmentps_fragment PSFRG_TEX_BASE_DIFFUSEPSFRG_TEX_BASE_DIFFUSE {{ defdef #define PS_TEX_BASE#define PS_TEX_BASE }} //------------------------------------------------//------------------------------------------------ // PSFRG_TEX_2ND : 2// PSFRG_TEX_2ND : 2 番目のテクスチャピクセルシェーダフラグメント番目のテクスチャピクセルシェーダフラグメント // 2// 2 番目のテクスチャなし番目のテクスチャなし ps_fragmentps_fragment PSFRG_TEX_2ND_NONEPSFRG_TEX_2ND_NONE {{ }} // 2// 2 番目のテクスチャはベーステクスチャのモデュレーション番目のテクスチャはベーステクスチャのモデュレーション (( ディティーディティー ル等ル等 )) ps_fragmentps_fragment PSFRG_TEX_2ND_MODULATEPSFRG_TEX_2ND_MODULATE {{ defdef #define PS_TEX_MODULATE_DIFFUSE#define PS_TEX_MODULATE_DIFFUSE }} // 2// 2 番目のテクスチャは焼付けシャドウ/ライトマップ番目のテクスチャは焼付けシャドウ/ライトマップ ps_fragmentps_fragment PSFRG_TEX_2ND_LIGHTMAPPSFRG_TEX_2ND_LIGHTMAP {{ defdef #define PS_TEX_LIGHT_PRIMARY#define PS_TEX_LIGHT_PRIMARY }} ©2005 BUNKASHA PUBLISHING©2005 BUNKASHA PUBLISHING //------------------------------------------------//------------------------------------------------ // PSFRG_TEX_SHADOWMAP :// PSFRG_TEX_SHADOWMAP : シャドウマップフラグメントシャドウマップフラグメント //// シャドウマップなしシャドウマップなし ps_fragmentps_fragment PSFRG_TEX_SHADOWMAP_NONEPSFRG_TEX_SHADOWMAP_NONE {{ }} //// シャドウマップありシャドウマップあり ps_fragmentps_fragment PSFRG_TEX_SHADOWMAP_SHADOWMAPPSFRG_TEX_SHADOWMAP_SHADOWMAP {{ defdef #define#define PS_TEX_SHADOW_PRIMARYPS_TEX_SHADOW_PRIMARY }} //------------------------------------------------//------------------------------------------------ // PSFUNC_TEX_ENV :// PSFUNC_TEX_ENV : 環境マップピクセルシェーダフラグ環境マップピクセルシェーダフラグ メントメント //// 環境マップテクスチャなし環境マップテクスチャなし ps_fragmentps_fragment PSFRG_TEX_ENV_NONEPSFRG_TEX_ENV_NONE {{ }} // (// ( フレネル等のフレネル等の )) 反射率による環境マップ反射率による環境マップ ps_fragmentps_fragment PSFRG_TEX_ENV_REFLECTPSFRG_TEX_ENV_REFLECT {{ defdef #define#define PS_TEX_ENV_REFLECTANCEPS_TEX_ENV_REFLECTANCE }} //// 加算系環境マップ加算系環境マップ ps_fragmentps_fragment PSFRG_TEX_ENV_ADDPSFRG_TEX_ENV_ADD {{ defdef #define PS_TEX_ENV_ADD#define PS_TEX_ENV_ADD }}

×