115
汎汎汎汎汎汎汎汎汎汎 汎汎汎汎汎汎汎汎汎汎 汎汎汎汎汎汎汎汎汎 汎汎汎汎汎汎汎汎汎 シシシシシシシシシシシシ シシシシシシシシシシシシ シシ シシ シシ シシ [email protected] [email protected]

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

シリコンスタジオ株式会社シリコンスタジオ株式会社

川瀬 正樹川瀬 正樹[email protected]@siliconstudio.co.jp

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

アジェンダアジェンダ• シェーダシェーダを取り巻く環境を取り巻く環境• シェーダの組み込みシェーダの組み込み• シェーダシェーダパイプラインパイプラインの設計の設計• 組み合わせ組み合わせの自動生成の自動生成• HLSLを使った設計HLSLを使った設計• 組み合わせ組み合わせの発散問題の発散問題• シェーダを減らすシェーダを減らす• シェーダの管理シェーダの管理• 実装例実装例

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

シェーダを取り巻く環境シェーダを取り巻く環境

アジェンダ

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

シェーダを取り巻く環境シェーダを取り巻く環境• 次世代以降は全てプログラマブルシェーダ次世代以降は全てプログラマブルシェーダ

– PCPC– Xbox 360Xbox 360– PS3PS3

• シェーダを利用した技術の研究シェーダを利用した技術の研究– どんどん進んでいるどんどん進んでいる

• サンプル/デモは充実しているサンプル/デモは充実している– ハードウェアベンダの開発者向けハードウェアベンダの開発者向け webweb ページページ– DirectX SDKDirectX SDK– etc.etc.

• とりあえず書いてみる/試してみるとりあえず書いてみる/試してみる– 非常に簡単非常に簡単

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

シェーダの組み込みシェーダの組み込み

アジェンダ

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

シェーダをゲームに利用したいシェーダをゲームに利用したい• インハウスエンジンへの組み込みインハウスエンジンへの組み込み

– ポストエフェクトなどのシェーダポストエフェクトなどのシェーダ• 他の処理との独立性が高い他の処理との独立性が高い• 組み込みは比較的容易組み込みは比較的容易

– シーンレンダリングのマテリアルシェーダシーンレンダリングのマテリアルシェーダ• 考慮すべき事項が多い考慮すべき事項が多い• 一般的に面倒一般的に面倒

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

シーンレンダリングのシェーダシーンレンダリングのシェーダ• サンプルに特化したシェーダとは違うサンプルに特化したシェーダとは違う• サンプル/デモサンプル/デモ

– 特化した少数のシェーダを用意するだけで良い特化した少数のシェーダを用意するだけで良い• ゲームなどの応用プログラムゲームなどの応用プログラム

– さまざまな条件のシェーダが必要さまざまな条件のシェーダが必要

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

シェーダを利用するにはシェーダを利用するには• あるマテリアル表現のシェーダを追加したいあるマテリアル表現のシェーダを追加したい

– 例えば動的環境マップ例えば動的環境マップ• 専用のシェーダを一つ追加するだけ?専用のシェーダを一つ追加するだけ?

– それだけなら簡単だが…それだけなら簡単だが…• 現実にはそう簡単にはいかない現実にはそう簡単にはいかない

– シェーダはいろいろな機能から構成されるシェーダはいろいろな機能から構成される– その他の処理の条件は?その他の処理の条件は?

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

その他の処理は?その他の処理は?• 頂点アニメーションは?頂点アニメーションは?

– 無し?無し?– インデクス付きスキニング?インデクス付きスキニング?– モーフィング?モーフィング?

• ライティングの条件は?ライティングの条件は?– 無し?無し?– 平行光源いくつ?平行光源いくつ?– 点光源いくつ?点光源いくつ?– スペキュラーは?スペキュラーは?– 自己発光は?自己発光は?

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

その他の処理は?(2)その他の処理は?(2)• シャドウは?シャドウは?• フォグは?フォグは?• 環境マップ以外のテクスチャは?環境マップ以外のテクスチャは?

– いくつ使う?いくつ使う?– どういう演算で合成する?どういう演算で合成する?

• 法線マップ(バンプマップ)を利用する?法線マップ(バンプマップ)を利用する?

• etc. etc. etc.etc. etc. etc.

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

シェーダを利用するにはシェーダを利用するには• 特定の機能のシェーダを追加するには特定の機能のシェーダを追加するには

– 他の処理との組み合わせが必須他の処理との組み合わせが必須– 1つのシェーダを追加するだけでは対応できない1つのシェーダを追加するだけでは対応できない

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

シェーダパイプラインの設計シェーダパイプラインの設計

アジェンダ

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

シェーダパイプラインシェーダパイプライン• パイプラインパイプライン

– シェーダとしての処理の流れシェーダとしての処理の流れ– 一連のファンクションの流れ一連のファンクションの流れ

• ファンクションファンクション– パイプライン(シェーダ)を構成する各機能ブロック/フェパイプライン(シェーダ)を構成する各機能ブロック/フェ

ーズーズ– ファンクションの例ファンクションの例

• アニメーションアニメーション• 座標変換座標変換• テクスチャ座標処理テクスチャ座標処理• 環境マップ座標生成環境マップ座標生成• ライティング処理ライティング処理• etc.etc.

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

シェーダパイプライン(2)シェーダパイプライン(2)• フラグメントフラグメント

– 各ファンクションの具体的な動作各ファンクションの具体的な動作– コード断片コード断片– 環境マップ座標生成ファンクションのフラグメント環境マップ座標生成ファンクションのフラグメント

例例• 無効無効• ワールド基底キューブマップ座標生成ワールド基底キューブマップ座標生成• スフィアマップ座標生成スフィアマップ座標生成• 平面反射マップ座標生成平面反射マップ座標生成• etc.etc.

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

シェーダパイプライン(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

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

経路がシェーダとなる経路がシェーダとなる

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

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

組み合わせを作る組み合わせを作る• 機能を組み合わせたシェーダを作るアプローチ機能を組み合わせたシェーダを作るアプローチ

– 必要な組み合わせを手作業で作成必要な組み合わせを手作業で作成– 組み合わせをツールで自動生成組み合わせをツールで自動生成

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

組み合わせを手作業で作成組み合わせを手作業で作成• 設計は楽設計は楽• 新しいシェーダの追加が面倒新しいシェーダの追加が面倒

– 既存の機能の組み合わせごとに新しい機能を追加し既存の機能の組み合わせごとに新しい機能を追加したシェーダが必要たシェーダが必要

– ファンクションが増えてくるほど追加が大変になるファンクションが増えてくるほど追加が大変になる• 組み合わせ総数が増えるほど開発効率が落ちる組み合わせ総数が増えるほど開発効率が落ちる• 100を超えるとちょっと厳しい100を超えるとちょっと厳しい

• 組み合わせの少ないエンジンに向いている組み合わせの少ないエンジンに向いている– 汎用性は低い汎用性は低い– シェーダのフロー制御により以前よりは現実的シェーダのフロー制御により以前よりは現実的

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

組み合わせの自動生成組み合わせの自動生成

アジェンダ

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

組み合わせを自動生成組み合わせを自動生成• 組み合わせ作成へのもう1つのアプローチ組み合わせ作成へのもう1つのアプローチ• 汎用性/拡張性の高いエンジン向き汎用性/拡張性の高いエンジン向き• メタ言語でシェーダパイプラインを定義メタ言語でシェーダパイプラインを定義• 最終的なシェーダコードはツールで生成最終的なシェーダコードはツールで生成• 設計はやや面倒設計はやや面倒

– シェーダコードを生成するツールシェーダコードを生成するツール– コード生成制御メタ言語コード生成制御メタ言語

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

シェーダコード生成の制御シェーダコード生成の制御• メタ言語で構成を定義メタ言語で構成を定義

– パイプラインパイプライン• パイプラインを構成するファンクションパイプラインを構成するファンクション• ベースとなるシェーダ(ファイル)の指定ベースとなるシェーダ(ファイル)の指定• パイプライン固有のコードなどパイプライン固有のコードなど

– シェーダに挿入される定数定義などシェーダに挿入される定数定義など– ファンクションファンクション

• ファンクションの持つフラグメント種別ファンクションの持つフラグメント種別• ファンクション固有のコードなどファンクション固有のコードなど

– フラグメントフラグメント• 不要な組み合わせの無効化指定不要な組み合わせの無効化指定• フラグメント固有のコードなどフラグメント固有のコードなど

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

メタ言語による定義例メタ言語による定義例// --------------------------------------------------------// --------------------------------------------------------// // 頂点シェーダパイプライン頂点シェーダパイプラインvs_pipe vs_pipe VSPIPE_STANDARDVSPIPE_STANDARD{{

// // 当該パイプラインのベースとなる当該パイプラインのベースとなる// // シェーダコードシェーダコードcodecode VSPIPE_STANDARD.hlslVSPIPE_STANDARD.hlsl

// // パイプラインを構成するファンクションパイプラインを構成するファンクションVSFUNC_ANIMATIONVSFUNC_ANIMATIONVSFUNC_TRANSFORMVSFUNC_TRANSFORMVSFUNC_TEXCOORDVSFUNC_TEXCOORD

}}

// -------------------------------------------------------// -------------------------------------------------------// // 頂点シェーダファンクション定義頂点シェーダファンクション定義// VSPIPE_STANDARD // VSPIPE_STANDARD のファンクションのファンクション

// // 座標変換ファンクション座標変換ファンクションvs_functionvs_function VSFUNC_TRANSFORM VSFUNC_TRANSFORM{{

// // 当該ファンクションのフラグメント種別当該ファンクションのフラグメント種別VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS // // 同次座標変換同次座標変換

}}

// // 頂点シェーダファンクション頂点シェーダファンクション (( テクスチャ座標出力テクスチャ座標出力 ))vs_functionvs_function VSFUNC_TEXCOORD VSFUNC_TEXCOORD{{

// // 当該ファンクションのフラグメント種別当該ファンクションのフラグメント種別VSFRG_TEX_PASSTHRUVSFRG_TEX_PASSTHRUVSFRG_TEX_SPHEREMAPVSFRG_TEX_SPHEREMAP // // スフィアマップスフィアマップ// // カメラスペース座標カメラスペース座標VSFRG_TEX_CAMERASPACEPOSITIONVSFRG_TEX_CAMERASPACEPOSITION

}}

// -------------------------------------------------------// -------------------------------------------------------// // 頂点シェーダフラグメント定義頂点シェーダフラグメント定義

//------------------------------------//------------------------------------// VSFUNC_TRANSFORM // VSFUNC_TRANSFORM のフラグメント種別のフラグメント種別// // 同次座標変換同次座標変換vs_fragment vs_fragment VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS{{

// // シェーダコードの直前に挿入されるコードシェーダコードの直前に挿入されるコードdefdef #define ENABLE_TRANSFORM_HPOS#define ENABLE_TRANSFORM_HPOS

}}

//------------------------------------//------------------------------------// VSFUNC_TEXCOORD // VSFUNC_TEXCOORD のフラグメント種別のフラグメント種別// // そのまま出力そのまま出力vs_fragment vs_fragment VSFRG_TEX_PASSTHRUVSFRG_TEX_PASSTHRU{{}}

// // スフィアマップ座標出力スフィアマップ座標出力vs_fragment vs_fragment VSFRG_TEX_SPHEREMAPVSFRG_TEX_SPHEREMAP{{

// // シェーダコードの直前に挿入されるコードシェーダコードの直前に挿入されるコードdefdef #define TEXGEN_SPHEREMAP#define TEXGEN_SPHEREMAP

}}

// // カメラスペース座標を出力カメラスペース座標を出力vs_fragment vs_fragment VSFRG_TEX_CAMERASPACEPOSITIONVSFRG_TEX_CAMERASPACEPOSITION{{

defdef #define TEXGEN_CAMERAPOSITION#define TEXGEN_CAMERAPOSITION}}

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

シェーダコードの記述シェーダコードの記述• パイプラインの機能を処理するシェーダを書くパイプラインの機能を処理するシェーダを書く

– 定数の条件によってフラグメントを選択定数の条件によってフラグメントを選択• #define #define や や static conststatic const 変数などで識別変数などで識別• 簡単で扱いやすい簡単で扱いやすい• 柔軟にコーディングできる柔軟にコーディングできる

– ファンクション間では任意のコードを処理できるファンクション間では任意のコードを処理できる– メタ言語での定義順序と一致する必要はないメタ言語での定義順序と一致する必要はない– 実行順序を変更してもメタ言語での定義は変更しなくて済む実行順序を変更してもメタ言語での定義は変更しなくて済む

– メタ言語で定義した内容との整合性にだけは注意メタ言語で定義した内容との整合性にだけは注意

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

シェーダコード例シェーダコード例// // フラグメント種別によって処理を変更フラグメント種別によって処理を変更

#ifdef #ifdef ENABLE_TRANSFORM_HPOSENABLE_TRANSFORM_HPOSvOut.vPosition = Transform(vIn.vPosition) ;vOut.vPosition = Transform(vIn.vPosition) ;#endif#endif // #ifdef ENABLE_TRANSFORM_HPOS// #ifdef ENABLE_TRANSFORM_HPOS

#ifdef #ifdef TEXGEN_SPHEREMAPTEXGEN_SPHEREMAPvOut.vTexCoordvOut.vTexCoord = GenerateSphereMapTexCoord() ;= GenerateSphereMapTexCoord() ;#endif#endif // #ifdef TEXGEN_SPHEREMAP// #ifdef TEXGEN_SPHEREMAP

#ifdef #ifdef TEXGEN_CAMERAPOSITIONTEXGEN_CAMERAPOSITIONvOut.vTexCoord = GenerateCameraSpacePosition(vIn.vPosition) ;vOut.vTexCoord = GenerateCameraSpacePosition(vIn.vPosition) ;#endif#endif // #ifdef TEXGEN_CAMERAPOSITION// #ifdef TEXGEN_CAMERAPOSITION

..

..

..

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

シェーダコードの生成シェーダコードの生成• ツールでシェーダコード生成ツールでシェーダコード生成

– フラグメント種別を定義するコードを生成フラグメント種別を定義するコードを生成– またはメタ言語上で任意のコードを記述可能にまたはメタ言語上で任意のコードを記述可能に

• 自由な定義を書けるため柔軟性は高い自由な定義を書けるため柔軟性は高い– ツールがシェーダの直前に定義コードを挿入ツールがシェーダの直前に定義コードを挿入

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

HLSLを使った設計HLSLを使った設計

アジェンダ

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

自動生成とアセンブリ/HLSL自動生成とアセンブリ/HLSL• 自動生成とアセンブリシェーダの相性は良くな自動生成とアセンブリシェーダの相性は良くな

いい– 通常最適化されない(一部例外あり)通常最適化されない(一部例外あり)

• 必要な処理の管理/最適化必要な処理の管理/最適化– 一時レジスタの管理が大変一時レジスタの管理が大変

• 不要なレジスタは極力使用しない不要なレジスタは極力使用しない– 一時レジスタの数に制限がある一時レジスタの数に制限がある– 一時レジスタの使用数がパフォーマンスに影響する一時レジスタの使用数がパフォーマンスに影響する

– 多少の無駄が発生してしまう可能性が高い多少の無駄が発生してしまう可能性が高い• HLSL HLSL とは相性が良いとは相性が良い

– コード生成/連結後に最適化されるコード生成/連結後に最適化される– 変数はいくらでも利用できる変数はいくらでも利用できる

• 不要な変数は 不要な変数は HLSL HLSL コンパイラが自動的に削除コンパイラが自動的に削除

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

高水準言語を使用高水準言語を使用• 今後は 今後は HLSLHLSL // Cg Cg を利用するを利用する

– デメリットよりもメリットの方が大きいデメリットよりもメリットの方が大きい

• ID3DXEffectID3DXEffect // CgFX CgFX などのエフェクト機構などのエフェクト機構– 便利だが組み合わせとの相性があまり良くない便利だが組み合わせとの相性があまり良くない

• 頂点/ピクセルシェーダのペア(頂点/ピクセルシェーダのペア( techniquetechnique )の定義が必)の定義が必要要

• 考えられる組み合わせが多過ぎる考えられる組み合わせが多過ぎる

– 利用しない方が汎用性は高い利用しない方が汎用性は高い• 組み合わせが少数なら問題ない組み合わせが少数なら問題ない• データに依存してシェーダを生成するなど、使用する組データに依存してシェーダを生成するなど、使用する組

み合わせを予め制限できる場合も問題ないみ合わせを予め制限できる場合も問題ない

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

エフェクトを使わない場合エフェクトを使わない場合• 組み合わせ毎に個別にコードをコンパイル組み合わせ毎に個別にコードをコンパイル

– シェーダに付随する情報は自分で管理シェーダに付随する情報は自分で管理– Direct3D Direct3D の場合の場合

• D3DXGetShader*() D3DXGetShader*() でコンパイル結果から情報を取得できでコンパイル結果から情報を取得できるる

– D3DXGetShaderConstantTable()D3DXGetShaderConstantTable()

– D3DXGetShaderInputSemantics()D3DXGetShaderInputSemantics()

– D3DXGetShaderOutputSemantics()D3DXGetShaderOutputSemantics()

– D3DXGetShaderSamplers()D3DXGetShaderSamplers()

– etc.etc.

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

入出力セマンティックの定義入出力セマンティックの定義• メタ言語で必要なセマンティックを指定メタ言語で必要なセマンティックを指定

– セマンティック/型および要素数/変数名などセマンティック/型および要素数/変数名など– パイプライン/ファンクション/フラグメント単位パイプライン/ファンクション/フラグメント単位

に指定に指定• それぞれのレベルで指定可能にしておくと良いそれぞれのレベルで指定可能にしておくと良い

• ツールで ツールで HLSL HLSL の定義コードを生成の定義コードを生成– シェーダ毎に生成シェーダ毎に生成

• コード中に必要とされたセマンティックコード中に必要とされたセマンティック– 入出力パラメタを構造体として定義入出力パラメタを構造体として定義

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

メタ言語サンプルメタ言語サンプル// -----------------------------------------------------------------------------------------// -----------------------------------------------------------------------------------------// // 頂点/ピクセルシェーダ入出力セマンティック頂点/ピクセルシェーダ入出力セマンティックshader_semanticsshader_semantics{{

// // 入出力指定入出力指定 変数名変数名 型型 ,, セマンティックセマンティックvs_invs_in vPositionvPosition float3float3,, POSITIONPOSITION // // 頂点座標頂点座標vs_outvs_out vPositionvPosition float4float4,, POSITIONPOSITION // // 出力同次座標出力同次座標

vs_invs_in vNormalvNormal float3float3,, NORMALNORMAL // // 法線ベクトル法線ベクトルvs_outvs_out vNormal vNormal float3float3,, TEXCOORD4TEXCOORD4ps_inps_in vNormalvNormal half3half3,, TEXCOORD4TEXCOORD4

vs_invs_in vTangentvTangent float3float3,, TANGENTTANGENT // // 接線ベクトル接線ベクトルvs_outvs_out vTangentvTangent float3float3,, TEXCOORD5TEXCOORD5ps_inps_in vTangentvTangent half3half3,, TEXCOORD5TEXCOORD5

vs_invs_in vTexCoord2DvTexCoord2D float2float2,, TEXCOORD0TEXCOORD0 // // テクスチャ座標0テクスチャ座標0vs_outvs_out vTexCoord2DvTexCoord2D float2float2,, TEXCOORD0TEXCOORD0ps_inps_in vTexCoord2DvTexCoord2D half2half2,, TEXCOORD0TEXCOORD0

}}

// -----------------------------------------------------------------------------------------// -----------------------------------------------------------------------------------------// // 頂点シェーダパイプライン頂点シェーダパイプライン (( 標準的なパイプライン標準的なパイプライン ))vs_pipe vs_pipe VSPIPE_STANDARDVSPIPE_STANDARD{{

// // 当該パイプラインのベースとなるシェーダコード当該パイプラインのベースとなるシェーダコードcodecode VSPIPE_STANDARD.hlslVSPIPE_STANDARD.hlsl

// // パイプラインを構成するファンクションパイプラインを構成するファンクションVSFUNC_ANIMATIONVSFUNC_ANIMATIONVSFUNC_TRANSFORMVSFUNC_TRANSFORMVSFUNC_NORMALMAPVSFUNC_NORMALMAPVSFUNC_TEXCOORD0VSFUNC_TEXCOORD0

}}

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

メタ言語サンプル(2)メタ言語サンプル(2)// -----------------------------------------------------------// -----------------------------------------------------------// // 頂点シェーダファンクション定義頂点シェーダファンクション定義// VSPIPE_STANDARD// VSPIPE_STANDARD

// // 頂点シェーダファンクション頂点シェーダファンクション (( 座標変換座標変換 ))vs_functionvs_function VSFUNC_TRANSFORM VSFUNC_TRANSFORM{{

// // 当該ファンクションのフラグメント種別当該ファンクションのフラグメント種別VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS // // 同次座標変換同次座標変換

// // 当該ファンクション共通の入出力セマンティック当該ファンクション共通の入出力セマンティックvs_invs_in vPositionvPosition // // 頂点座標入力頂点座標入力

}}

// // 頂点シェーダファンクション頂点シェーダファンクション (( 法線マップセットアップ法線マップセットアップ ))vs_functionvs_function VSFUNC_NORMALMAP VSFUNC_NORMALMAP{{

// // 当該ファンクションのフラグメント種別当該ファンクションのフラグメント種別VSFRG_NORMALMAP_NONEVSFRG_NORMALMAP_NONE // // 法線マップ無効法線マップ無効VSFRG_NORMALMAP_ENABLEVSFRG_NORMALMAP_ENABLE // // 法線マップ有効法線マップ有効

// // 当該ファンクション共通の入出力セマンティック当該ファンクション共通の入出力セマンティックvs_invs_in vNormalvNormal // // 法線ベクトル入力法線ベクトル入力

}}

// -----------------------------------------------------------// -----------------------------------------------------------// // 頂点シェーダフラグメント定義頂点シェーダフラグメント定義// VSFUNC_TRANSFORM// VSFUNC_TRANSFORM

// // 頂点シェーダフラグメント頂点シェーダフラグメント (( 同次座標変換同次座標変換 ))vs_fragment vs_fragment VSFRG_XFORM_HPOSVSFRG_XFORM_HPOS{{

// // シェーダコードの直前に挿入されるコードシェーダコードの直前に挿入されるコードdefdef #define ENABLE_TRANSFORM_HPOS#define ENABLE_TRANSFORM_HPOS

// // 当該フラグメントで必要な入出力セマンティック当該フラグメントで必要な入出力セマンティックvs_outvs_out vPositionvPosition // // 同次座標出力同次座標出力

}}

// -----------------------------------------------------------// -----------------------------------------------------------// // 頂点シェーダフラグメント定義頂点シェーダフラグメント定義// VSFUNC_NORMALMAP// VSFUNC_NORMALMAP

// // 頂点シェーダフラグメント頂点シェーダフラグメント (( タンジェントベクトル無効タンジェントベクトル無効 ))vs_fragmentvs_fragment VSFRG_NORMALMAP_NONE VSFRG_NORMALMAP_NONE{{}}

// // 頂点シェーダフラグメント頂点シェーダフラグメント (( タンジェントベクトルセットアップタンジェントベクトルセットアップ ))vs_fragmentvs_fragment VSFRG_NORMALMAP_ENABLE VSFRG_NORMALMAP_ENABLE{{

// // シェーダコードの直前に挿入されるコードシェーダコードの直前に挿入されるコードdefdef #define ENABLE_SETUPTANGENT#define ENABLE_SETUPTANGENT

// // 当該フラグメントで必要な入出力セマンティック当該フラグメントで必要な入出力セマンティックvs_invs_in vTangentvTangent // // 接線ベクトル入力接線ベクトル入力vs_outvs_out vNormalvNormal // // 法線ベクトル出力法線ベクトル出力vs_outvs_out vTangentvTangent // // 接線ベクトル出力接線ベクトル出力

}}

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

生成されるシェーダコード生成されるシェーダコード//-------------------------------------------------------//-------------------------------------------------------// 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 :: TEXCOORD4 TEXCOORD4 float3float3 vTangentvTangent :: TEXCOORD5 TEXCOORD5} ;} ;

自動生成され挿入されるコード部分自動生成され挿入されるコード部分//-------------------------------------------------------//-------------------------------------------------------// "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 ;}}

ベースとなるシェーダコード部分ベースとなるシェーダコード部分

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

生成されるシェーダコード(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 ;}}

ベースとなるシェーダコード部分ベースとなるシェーダコード部分

灰色の部分のコードは処理されない灰色の部分のコードは処理されない

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

HLSLのコーディングHLSLのコーディング• 決まりはない決まりはない

– 自分が判りやすいようにコーディングすれば良い自分が判りやすいようにコーディングすれば良い

• 各ファンクションを 各ファンクションを HLSL HLSL の関数として記述の関数として記述– 構造が判りやすくなるのでお勧め構造が判りやすくなるのでお勧め– 各ファンクションを処理する関数各ファンクションを処理する関数

• プリプロセッサ定義の条件を関数の引数とするプリプロセッサ定義の条件を関数の引数とする• 関数内で条件コンパイル関数内で条件コンパイル• 関数の外側から条件コンパイル関数の外側から条件コンパイル• etc.etc.

– 各関数を適切な順序でコール各関数を適切な順序でコール

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

HLSLのコーディング(2)HLSLのコーディング(2)• 後続のファンクションで参照される情報後続のファンクションで参照される情報

– 可能性のある情報は全て計算しておいても良い可能性のある情報は全て計算しておいても良い• 座標座標• 法線ベクトル法線ベクトル• 反射ベクトル反射ベクトル• etc.etc.

– これらを主要な座標系でそれぞれ計算しておくと便これらを主要な座標系でそれぞれ計算しておくと便利利

• ローカルローカル (( モデリングモデリング )) 座標系座標系• ワールド座標系ワールド座標系• カメラ座標系カメラ座標系• etc.etc.

– コンパイル時の最適化で不要なコードは削除されるコンパイル時の最適化で不要なコードは削除される

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

DCCDCC ツールとの連携ツールとの連携• 33 DD ツールにパイプライン/ファンクションツールにパイプライン/ファンクション

の一部を公開の一部を公開– プラグインとして提供プラグインとして提供

• メタ言語で動作を定義できると理想的メタ言語で動作を定義できると理想的– 主にマテリアル関連のファンクションを公開主にマテリアル関連のファンクションを公開

• その他アーティストによる指定が自然と思われるものその他アーティストによる指定が自然と思われるもの• ファンクション構成はパイプラインによって異なるファンクション構成はパイプラインによって異なる

• アーティストがパイプラインとフラグメントをアーティストがパイプラインとフラグメントを選択選択

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

設計時に留意すること設計時に留意すること• 拡張性/柔軟性拡張性/柔軟性

– パイプライン/ファンクションなどの追加コストをパイプライン/ファンクションなどの追加コストをできるだけ減らすできるだけ減らす

• シェーダは僅かな知識/アイデア/センスがあれば誰でもシェーダは僅かな知識/アイデア/センスがあれば誰でも書ける書ける

• 優れたシェーダ管理機構があれば、容易にアイデアを具現優れたシェーダ管理機構があれば、容易にアイデアを具現化できる化できる

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

組み合わせの発散問題組み合わせの発散問題

アジェンダ

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

組み合わせの爆発!!組み合わせの爆発!!• 組み合わせは際限無く増える組み合わせは際限無く増える• 指数関数的に増加指数関数的に増加

– 機能ごとに2~4倍ずつ増える機能ごとに2~4倍ずつ増える– 1,000 1,000 を超えたら を超えたら 10,000 10,000 を超えるのも時間の問題を超えるのも時間の問題

• ではどのくらいの組み合わせが発生するのか?ではどのくらいの組み合わせが発生するのか?– とりあえず思いつくままに列挙とりあえず思いつくままに列挙

• 大雑把に計算してみる大雑把に計算してみる• 合理性/整合性などは無視合理性/整合性などは無視

– 例えば…例えば…

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

頂点処理の組み合わせ頂点処理の組み合わせ• 頂点アニメーション系の組み合わせ頂点アニメーション系の組み合わせ

– インデクス付きスキニングインデクス付きスキニング• 4 4 種類  (無効/ボーン2~4)種類  (無効/ボーン2~4)

– モーフィングモーフィング• 4 4 種類  (無効/ターゲット2~4)種類  (無効/ターゲット2~4)

– 44 ×4 = 16 ×4 = 16 種類種類• カラーカラー αα チャネル出力系チャネル出力系

– プライマリカラープライマリカラー• 3 3 種類  (無効/不透明度/反射率)種類  (無効/不透明度/反射率)

– セカンダリカラーセカンダリカラー• 3 3 種類  (無効/自己発光/遮蔽項)種類  (無効/自己発光/遮蔽項)

– 33××3 = 9 3 = 9 種類種類

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

頂点処理の組み合わせ(2)頂点処理の組み合わせ(2)• テクスチャ座標出力系テクスチャ座標出力系

– プライマリテクスチャ座標プライマリテクスチャ座標• 4 4 種類 (無効/そのまま出力/UVアニメ/座標から種類 (無効/そのまま出力/UVアニメ/座標から

生成)生成)

– セカンダリテクスチャ座標セカンダリテクスチャ座標• 3 3 種類  (無効/プライマリ座標と共有/セカンダリ座種類  (無効/プライマリ座標と共有/セカンダリ座

標)標)

– シャドウマップテクスチャ座標シャドウマップテクスチャ座標• 3 3 種類  (無効/平行投影/スポットライト)種類  (無効/平行投影/スポットライト)

– 44××33×3×3 = 36 = 36 種類種類

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

頂点処理の組み合わせ(3)頂点処理の組み合わせ(3)• 頂点カラー頂点カラー

– 5 5 種類種類  (無効/シャドウ/ディフューズ/スペ  (無効/シャドウ/ディフューズ/スペキュラー/自己発光)キュラー/自己発光)

• 頂点ライティングを行う場合頂点ライティングを行う場合– ライティング系の組み合わせライティング系の組み合わせ

• 平行光源平行光源– 3 3 種類  (0~2個)種類  (0~2個)

• 点光源点光源– 3 3 種類  (0~2個)種類  (0~2個)

• 3×3 = 9 3×3 = 9 種類種類– 環境マップ環境マップ

• 3 3 種類  (無効/平面反射/キューブマップ)種類  (無効/平面反射/キューブマップ)– 9×9×3 = 27 3 = 27 種類種類

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

頂点処理の組み合わせ数は?頂点処理の組み合わせ数は?• etc.etc.• etc.etc.• etc.etc.

• ここまでの組み合わせ総数は…ここまでの組み合わせ総数は…– 頂点ライティングなし(ピクセルライティング頂点ライティングなし(ピクセルライティング

等)等)• 1616 ×× 99 ×× 3636 ×× 5=?5=?

– 頂点ライティング頂点ライティング• 1616 ×× 99 ×× 3636 ×× 55 ×× 27=?27=?

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

ピクセル処理の組み合わせピクセル処理の組み合わせ• αα チャネル用途系チャネル用途系

– ベーステクスチャベーステクスチャ αα• 4 4 種類 (無効/不透明度/グロスマップ/自己発光)種類 (無効/不透明度/グロスマップ/自己発光)

– プライマリカラープライマリカラー αα• 3 3 種類 (無効/不透明度/反射率)種類 (無効/不透明度/反射率)

– セカンダリカラーセカンダリカラー αα• 3 3 種類 (無効/自己発光/遮蔽項)種類 (無効/自己発光/遮蔽項)

– 44××33××3 = 36 3 = 36 種類種類

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

ピクセル処理の組み合わせ(2)ピクセル処理の組み合わせ(2)• テクスチャマップ系テクスチャマップ系

– ベーステクスチャベーステクスチャ• 2 2 種類  (無効/有効)種類  (無効/有効)

– 環境マップ環境マップ• 3 3 種類  (無効/反射率で補間/加算)種類  (無効/反射率で補間/加算)

– 屈折環境マップ屈折環境マップ• 2 2 種類  (無効/有効)種類  (無効/有効)

– デティールテクスチャマップデティールテクスチャマップ• 2 2 種類  (無効/有効)種類  (無効/有効)

– 2×2×33×2×2×2×2 = 24 = 24 種類種類

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

ピクセル処理の組み合わせ(3)ピクセル処理の組み合わせ(3)• ライトマップ系ライトマップ系

– シャドウマップシャドウマップ• 2 2 種類 (無効/有効)種類 (無効/有効)

– ライトマップライトマップ• 2 2 種類 (無効/有効)種類 (無効/有効)

– 自己発光マップ自己発光マップ• 2 2 種類 (無効/有効)種類 (無効/有効)

– 2×2×22×2×2 = = 88 種類種類

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

ピクセル処理の組み合わせ(4)ピクセル処理の組み合わせ(4)• ピクセルライティングを行う場合ピクセルライティングを行う場合

– 平行光源平行光源• 2 2 種類 (1~2個)種類 (1~2個)

– 点光源点光源• 3 3 種類 (0~2個)種類 (0~2個)

– 環境マップ座標計算環境マップ座標計算• 3 3 種類 (無効/平面反射/キューブマップ)種類 (無効/平面反射/キューブマップ)

– 22××33××3 = 18 3 = 18 種類種類

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

ピクセル処理の組み合わせ数は?ピクセル処理の組み合わせ数は?• etc.etc.• etc.etc.• etc.etc.

• ここまでの組み合わせ総数は…ここまでの組み合わせ総数は…– ピクセルライティングなしピクセルライティングなし

• 3636 ×× 2424 ×8××8× =?=?

– ピクセルライティングピクセルライティング• 3636 ×× 2424 ×8××8× 18=?18=?

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

頂点シェーダの組み合わせ数は?頂点シェーダの組み合わせ数は?• 頂点ライティングなし頂点ライティングなし

1616 ×× 99 ×× 3636 ×× 5=5=

25,92025,920• 頂点ライティング頂点ライティング

1616 ×× 99 ×× 3636 ×× 55 ×× 27=27=

699699,,840840

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

ピクセルシェーダの組み合わせ数は?ピクセルシェーダの組み合わせ数は?• ピクセルライティングなしピクセルライティングなし

3636 ×× 2424 ×8×8 ==

66,,912912• ピクセルライティングピクセルライティング

3636 ×× 2424 ×8××8× 18=18=

124124,,416416

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

組み合わせの爆発問題組み合わせの爆発問題• 現実的な数ではない…現実的な数ではない…

– 新しい機能を加えるとさらに数倍ずつ増加してしまう新しい機能を加えるとさらに数倍ずつ増加してしまう

• シェーダが増え過ぎるとシェーダが増え過ぎると– メモリを圧迫するメモリを圧迫する– シェーダの切り替えが多くなるシェーダの切り替えが多くなる– シェーダアセンブル/コンパイルに時間がかかるシェーダアセンブル/コンパイルに時間がかかる

• 万を超えるシェーダ生成はかなり非効率万を超えるシェーダ生成はかなり非効率• 本当にそれほど必要か本当にそれほど必要か

– 全く使われないシェーダが大半を占める可能性が高い全く使われないシェーダが大半を占める可能性が高い– ほとんどのケースではおそらく ほとんどのケースではおそらく 1% 1% も使われないも使われない

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

シェーダを減らすシェーダを減らす

アジェンダ

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

組み合わせ数を減らす組み合わせ数を減らす• 条件をある程度まとめる条件をある程度まとめる

– 光源やスキニングは最大数だけを用意光源やスキニングは最大数だけを用意– 複数のファンクションをまとめて組み合わせを制限複数のファンクションをまとめて組み合わせを制限

• 特殊なシェーダを標準のパイプラインから分離特殊なシェーダを標準のパイプラインから分離– 独自の処理が多く必要になる特殊なシェーダ独自の処理が多く必要になる特殊なシェーダ

• シャドウボリュームシャドウボリューム• 水面水面• 光学迷彩表現光学迷彩表現

– 一部のファンクションしか必要としないシェーダ一部のファンクションしか必要としないシェーダ• シャドウマップへの描画シャドウマップへの描画

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

最大数だけを用意最大数だけを用意• 光源やスキニングは最大数だけを用意する光源やスキニングは最大数だけを用意する

– ライティング系の組み合わせライティング系の組み合わせ• 平行光源 平行光源 33 種類(0~2個)種類(0~2個)• 点光源 点光源 33 種類(0~2個)種類(0~2個)

– 組み合わせ数 組み合わせ数 3×3 = 9 3×3 = 9 種類種類– これらをこれらを

• 平行光源 平行光源 22 種類(0または3個)種類(0または3個)• 点光源 点光源 22 種類(0または2個)種類(0または2個)

– 2×2 = 4 2×2 = 4 種類に種類に• メモリ量とパフォーマンスから総合的に判断メモリ量とパフォーマンスから総合的に判断• 可能ならフロー制御(ループ/条件分岐)を活用可能ならフロー制御(ループ/条件分岐)を活用

– フロー制御のパフォーマンスには注意フロー制御のパフォーマンスには注意

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

複数ファンクションの統合複数ファンクションの統合• 関連性の高い複数のファンクションをまとめる関連性の高い複数のファンクションをまとめる

– ライティング系の組み合わせライティング系の組み合わせ• 平行光源 平行光源 33 種類(0~2個)種類(0~2個)• 点光源 点光源 33 種類(0~2個)種類(0~2個)

– 組み合わせ数 組み合わせ数 3×3 = 9 3×3 = 9 種類種類– これらをまとめてこれらをまとめて

• 平行光源0+点光源0平行光源0+点光源0• 平行光源2+点光源1平行光源2+点光源1• 平行光源4+点光源2平行光源4+点光源2

– 合計で 合計で 3 3 種類種類だけにするだけにする• 可能ならフロー制御を活用可能ならフロー制御を活用

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

複数ファンクションの統合(2)複数ファンクションの統合(2)• マテリアルを一つのファンクションにマテリアルを一つのファンクションに

– マテリアルに関わるファンクションを全てまとめるマテリアルに関わるファンクションを全てまとめる• マテリアルファンクションのフラグメント例マテリアルファンクションのフラグメント例

– プラスティックプラスティック– 金属金属– 肌肌– アスファルトアスファルト– 水面水面

• ファンクションの組み合わせでマテリアルを表現するよりファンクションの組み合わせでマテリアルを表現するよりも組み合わせが減るも組み合わせが減る

• マテリアル表現の汎用性は落ちるマテリアル表現の汎用性は落ちる– あまりお勧めはしないあまりお勧めはしない

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

標準のパイプラインから分離標準のパイプラインから分離• 独自の処理が多く必要になる特殊なシェーダ独自の処理が多く必要になる特殊なシェーダ

– 例えば例えば• シャドウボリュームシャドウボリューム• 水面水面• 光学迷彩表現光学迷彩表現

• 別の専用のパイプラインを用意する別の専用のパイプラインを用意する– 標準のパイプラインから不要な機能の組み合わせを標準のパイプラインから不要な機能の組み合わせを削除できる削除できる

• 水面下の屈折処理水面下の屈折処理• シャドウボリュームの引き伸ばし処理シャドウボリュームの引き伸ばし処理• 光学迷彩の屈折処理光学迷彩の屈折処理• etc.etc.

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

標準のパイプラインから分離標準のパイプラインから分離(2)(2)

• 一部のファンクションしか必要としないシェー一部のファンクションしか必要としないシェーダダ– シャドウマップへの描画シャドウマップへの描画

• デプスバッファもしくはカラーへのデプス出力のみデプスバッファもしくはカラーへのデプス出力のみ– アニメーション/座標変換アニメーション/座標変換– αα テスト用テクスチャテスト用テクスチャ

• その他の処理の組み合わせは不要その他の処理の組み合わせは不要– 環境マップ/ライトマップ/ライティング/環境マップ/ライトマップ/ライティング/ etc.etc.

– 標準的なパイプラインに組み込むよりも標準的なパイプラインに組み込むよりも• 構成が判りやすくなり、管理が楽構成が判りやすくなり、管理が楽• シェーダの組み合わせの無駄を減らし易いシェーダの組み合わせの無駄を減らし易い

• そのためにはそのためには– パイプラインを自由に(容易に)追加できる設計にパイプラインを自由に(容易に)追加できる設計に

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

無駄なシェーダを生成しない無駄なシェーダを生成しない• 使われるシェーダのみを生成使われるシェーダのみを生成

– 明らかに必要の無い組み合わせは生成しない明らかに必要の無い組み合わせは生成しない• 反射率計算は環境マップとの併用のみ反射率計算は環境マップとの併用のみ

– 最終的に全く使われていないコードは削除最終的に全く使われていないコードは削除• データをスキャンして使用状況をチェックデータをスキャンして使用状況をチェック• シェーダコード数を劇的に減らせる可能性が高いシェーダコード数を劇的に減らせる可能性が高い• 動的に変化する可能性のあるファンクションに注意動的に変化する可能性のあるファンクションに注意

– ライティング/シャドウマップ/ライトマップ環境ライティング/シャドウマップ/ライトマップ環境– シェーダ シェーダ LOD LOD などのバリエーションなどのバリエーション– etc.etc.

– 最終データ確定までシェーダを確定できない最終データ確定までシェーダを確定できない

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

シェーダをデータに付属シェーダをデータに付属• データが作られたときに初めて該当する組み合わデータが作られたときに初めて該当する組み合わ

せを生成するせを生成する• 動的に変化するファンクションのバリエーション動的に変化するファンクションのバリエーション

も生成も生成• 全体的に無駄が少なくなり、拡張性も高くなるが全体的に無駄が少なくなり、拡張性も高くなるが

– パイプライン/ファンクションに変更があると、全てパイプライン/ファンクションに変更があると、全てのデータに対しシェーダの再コンパイルが必要のデータに対しシェーダの再コンパイルが必要

– シェーダコードが巨大になるとサイズバランスが悪いシェーダコードが巨大になるとサイズバランスが悪い• 場合によってはシェーダコードがデータの大半を占めてしまう場合によってはシェーダコードがデータの大半を占めてしまう

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

シェーダ生成シェーダ生成• 多くとも数千個程度に抑えるのが現実的多くとも数千個程度に抑えるのが現実的• フロー制御が実用的ならかなり節約できるフロー制御が実用的ならかなり節約できる

– 現実のフロー制御のパフォーマンスでは厳しいか現実のフロー制御のパフォーマンスでは厳しいか

• シェーダはデータに付属させるのが理想?シェーダはデータに付属させるのが理想?– プログラムからできるだけ独立させる方が良いプログラムからできるだけ独立させる方が良い– ただしシェーダに変更が発生すると厄介ただしシェーダに変更が発生すると厄介

• データの再コンバートが必要データの再コンバートが必要

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

シェーダの管理シェーダの管理

アジェンダ

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

シェーダの管理シェーダの管理• あるレンダリングに使うシェーダの識別あるレンダリングに使うシェーダの識別

– エフェクトの エフェクトの technique technique に相当するシェーダのペに相当するシェーダのペアア

• パイプライン内のシェーダは通し番号で管理パイプライン内のシェーダは通し番号で管理– 全組み合わせの通し番号全組み合わせの通し番号

• シェーダ番号、シェーダインデクスシェーダ番号、シェーダインデクス

• 通常 通常 32 bit 32 bit 程度で全シェーダを識別可能程度で全シェーダを識別可能– パイプライン パイプライン 44~~ 5 bit 5 bit 程度程度– 頂点/ピクセルシェーダ各 頂点/ピクセルシェーダ各 1111~~ 12 bit 12 bit 程度程度

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

シェーダへのアクセスシェーダへのアクセス• 使うシェーダがシェーダ番号で指定された場合使うシェーダがシェーダ番号で指定された場合

– 直接シェーダにアクセスできる直接シェーダにアクセスできる

• 任意のフラグメントの組み合わせ指定任意のフラグメントの組み合わせ指定– 組み合わせから動的にシェーダを決定したい場合組み合わせから動的にシェーダを決定したい場合

• フラグメントの種別からシェーダ番号を容易に確定できることフラグメントの種別からシェーダ番号を容易に確定できること

• シェーダ番号からフラグメント種別の逆引きシェーダ番号からフラグメント種別の逆引き– あるシェーダのフラグメント構成を知りたい場合などあるシェーダのフラグメント構成を知りたい場合など

• シェーダ番号から各フラグメントの種別を求める必要があるシェーダ番号から各フラグメントの種別を求める必要がある

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

シェーダ番号のアタッチシェーダ番号のアタッチ• 例えば例えば

– ファンクションファンクション A A は は 4 4 種類のフラグメントを持種類のフラグメントを持つつ

– ファンクションファンクション B B は は 3 3 種類種類のフラグメントのフラグメント– ファンクションファンクション C C は は 2 2 種類種類– ファンクションファンクション D D は は 44 種類種類

• というファンクションで構成されるパイプラというファンクションで構成されるパイプラインイン

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

あるパイプラインの構成あるパイプラインの構成

ファンクションファンクション D D (( fD=0fD=0 ~~ 33 ))

ファンクションファンクション C C (( fC=0fC=0 ~~ 11 ))

ファンクションファンクション B B (( fB=0fB=0 ~~ 22 ))

ファンクションファンクション A A (( fA=fA=00 ~~ 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 :各フラグメント種別(ゼロから始まる識別番号):各フラグメント種別(ゼロから始まる識別番号)

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

シェーダ番号のアタッチシェーダ番号のアタッチ

B1B1-C0-D0 -C0-D0 の組み合わせの組み合わせ

fA = 0,1,2,3fA = 0,1,2,3fB = 1fB = 1fC = 0fC = 0fD = 0fD = 0

シェーダ シェーダ #6#622-1-1-0-0-0-0

A-2A-2

B-1B-1

C-0C-0

D-0D-0

シェーダ シェーダ #7#733-1-1-0-0-0-0

A-3A-3

B-1B-1

C-0C-0

D-0D-0

シェーダ シェーダ #5#511-1-1-0-0-0-0

A-1A-1

B-1B-1

C-0C-0

D-0D-0

シェーダ シェーダ #4#400-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,3fB = 0fB = 0fC = 0fC = 0fD = 0fD = 0

シェーダ シェーダ #0#000-0-0-0-0-0-0

A-0A-0

B-0B-0

C-0C-0

D-0D-0

シェーダ シェーダ #1#111-0-0-0-0-0-0

A-1A-1

B-0B-0

C-0C-0

D-0D-0

シェーダ シェーダ #2#222-0-0-0-0-0-0

A-2A-2

B-0B-0

C-0C-0

D-0D-0

シェーダ シェーダ #3#333-0-0-0-0-0-0

A-3A-3

B-0B-0

C-0C-0

D-0D-0

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

シェーダ番号のアタッチ(2)シェーダ番号のアタッチ(2)• シェーダの通し番号をアタッチシェーダの通し番号をアタッチ

– フラグメントの組み合わせと通し番号を対応付けるフラグメントの組み合わせと通し番号を対応付ける• Index = fD×Index = fD× (4(4 ×× 33 ×× 2)+2)+ fC×fC× (4(4 ×× 3)+3)+ fB×fB× (( 44 ))

+ + fAfA– Index Index はシェーダ番号(通し番号)はシェーダ番号(通し番号)– fAfA ~~ fD fD は各フラグメント種別(ゼロから始まる識別番号)は各フラグメント種別(ゼロから始まる識別番号)

• 96(496(4 ×× 33 ×× 22 ×× 4)通りの番号(0~95)がユニーク4)通りの番号(0~95)がユニークに定まるに定まる

– 計算負荷計算負荷• 乗算:ファンクション数-1乗算:ファンクション数-1• 加算:ファンクション数加算:ファンクション数

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

フラグメント種別の逆引きフラグメント種別の逆引き• フラグメント種別の逆引きフラグメント種別の逆引き

– シェーダ番号から各フラグメント種別を計算シェーダ番号から各フラグメント種別を計算• fD = Index fD = Index /(4/(4 ×× 33 ×× 2)2) , rem = Index %, rem = Index % (4(4 ×× 33 ×× 2)2)• fC = rem fC = rem // (( 44 ×× 33 ), rem = rem %), rem = rem % (4(4 ×× 3)3)• fB = rem fB = rem /(4)/(4) , rem = rem %, rem = rem % (4)(4)• fA = remfA = rem

– Index Index はシェーダ番号(この例では0~95)はシェーダ番号(この例では0~95)– fAfA ~~ fD fD は各フラグメント種別(ゼロから始まる識別番号)は各フラグメント種別(ゼロから始まる識別番号)

– 計算負荷計算負荷• 剰余/除算のペア:ファンクション数-1剰余/除算のペア:ファンクション数-1

– テーブルを使うテーブルを使う• 組み合わせ数組み合わせ数 ×× ファンクション数の配列(96ファンクション数の配列(96 ×× 4=3844=384

要素)要素)– ファンクション毎にフラグメント種別を保持するファンクション毎にフラグメント種別を保持する– 各要素は通常 各要素は通常 8-bit 8-bit で充分(フラグメント種別を識別)で充分(フラグメント種別を識別)

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

テーブルを使うかテーブルを使うか• 計算で求めるかテーブルを使うか計算で求めるかテーブルを使うか

– テーブルサイズや使用頻度によって総合的に判断テーブルサイズや使用頻度によって総合的に判断• メモリキャッシュも意識しておくメモリキャッシュも意識しておく

• 使用頻度が高い使用頻度が高い– テーブルを使った方が効率が良い可能性が高いテーブルを使った方が効率が良い可能性が高い

• キャッシュヒットしやすいキャッシュヒットしやすい• 使用頻度が低い使用頻度が低い

– 計算した方がトータルで効率が良い可能性が高い計算した方がトータルで効率が良い可能性が高い• たとえ計算が遅くても使用頻度が低ければ問題にならないたとえ計算が遅くても使用頻度が低ければ問題にならない• キャッシュヒットしにくいキャッシュヒットしにくい• 組み合わせが多い場合はメモリを節約できる組み合わせが多い場合はメモリを節約できる

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

実装例実装例

アジェンダ

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

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

アセンブリでの実装例アセンブリでの実装例• XboxXbox• シェーダバージョンシェーダバージョン

– 1.1 1.1 ~ ~ 1.3 1.3 相当相当– 全てアセンブリで記述全てアセンブリで記述– プリプロセッサによる条件アセンブルでコードを制プリプロセッサによる条件アセンブルでコードを制

御御• 用途別にいくつかのパイプラインを作成用途別にいくつかのパイプラインを作成

– 標準的なパイプライン標準的なパイプライン– 夜の標準的なパイプライン夜の標準的なパイプライン– シャドウマップ描画用パイプラインシャドウマップ描画用パイプライン– 光学迷彩マテリアル用パイプライン光学迷彩マテリアル用パイプライン

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

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

シェーダ数シェーダ数• 頂点シェーダの組み合わせ頂点シェーダの組み合わせ

– 組み合わせ総数組み合わせ総数 18061806– 実際に生成される有効な組み合わせ実際に生成される有効な組み合わせ 17161716

• ピクセルシェーダの組み合わせピクセルシェーダの組み合わせ– 組み合わせ総数組み合わせ総数 436436– 実際に生成される有効な組み合わせ実際に生成される有効な組み合わせ 244244

• 無駄なコードも残っている無駄なコードも残っている– 最終的に使われないコードも含まれている最終的に使われないコードも含まれている

• 自動生成しないシェーダ自動生成しないシェーダ– フルシーンエフェクト/パーティクルなどフルシーンエフェクト/パーティクルなど– パーティクルは少数の組み合わせを手作業で作成パーティクルは少数の組み合わせを手作業で作成– 合計で合計で数十程度数十程度

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

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

コード(一部の抜粋)コード(一部の抜粋)• メタ言語による定義メタ言語による定義

– パイプラインパイプライン– ファンクションファンクション– フラグメントフラグメント

• シェーダコードシェーダコード– パイプライン共通のシェーダコードパイプライン共通のシェーダコード– シェーダファンクションサンプルシェーダファンクションサンプル

• それぞれ頂点/ピクセルシェーダ用それぞれ頂点/ピクセルシェーダ用

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

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

頂点パイプライン定義頂点パイプライン定義

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//--------------------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------------------// // 頂点シェーダパイプライン定義頂点シェーダパイプライン定義

// // 標準的なパイプライン標準的なパイプラインvs_pipevs_pipe VSPIPE_STANDARD VSPIPE_STANDARD{{

codecode VSPIPE_STANDARD.hVSPIPE_STANDARD.h // // 当該パイプラインで共通のコード部当該パイプラインで共通のコード部

// // パイプラインのファンクションパイプラインのファンクションVSFUNC_ANIMATIONVSFUNC_ANIMATIONVSFUNC_TRANSFORMVSFUNC_TRANSFORMVSFUNC_VERTEXCOLORVSFUNC_VERTEXCOLORVSFUNC_LIGHTINGVSFUNC_LIGHTINGVSFUNC_TEX_2NDVSFUNC_TEX_2ND // // ライトマップ/ディティールマップ等ライトマップ/ディティールマップ等VSFUNC_TEX_SHADOWMAPVSFUNC_TEX_SHADOWMAPVSFUNC_TEX_ENVMAPVSFUNC_TEX_ENVMAP // // 環境マップ座標生成/マテリアル制御環境マップ座標生成/マテリアル制御VSFUNC_OUTD0ALPHAVSFUNC_OUTD0ALPHA // oD0 // oD0 出力制御出力制御 (( 輝度輝度 ))

}}

// // 屈折レンダリングパイプライン屈折レンダリングパイプラインvs_pipevs_pipe VSPIPE_REFRACTION VSPIPE_REFRACTION{{

codecode VSPIPE_REFRACTION.hVSPIPE_REFRACTION.h // // 当該パイプラインで共通のコード部当該パイプラインで共通のコード部

VSFUNC_ANIMATIONVSFUNC_ANIMATIONVSFUNC_TRANSFORMVSFUNC_TRANSFORM

}}

// // シャドウマップ生成用パイプラインシャドウマップ生成用パイプラインvs_pipevs_pipe VSPIPE_SHADOWMAP VSPIPE_SHADOWMAP{{

codecode VSPIPE_STD_SHADOWMAP.hVSPIPE_STD_SHADOWMAP.h // // 当該パイプラインで共通のコード部当該パイプラインで共通のコード部

VSFUNC_ANIMATIONVSFUNC_ANIMATIONVSFUNC_TRANSFORMVSFUNC_TRANSFORM

}}

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

ピクセルパイプライン定義ピクセルパイプライン定義

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//--------------------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------------------// // ピクセルシェーダパイプライン定義ピクセルシェーダパイプライン定義

// // 昼レンダーモード用の標準的なパイプライン昼レンダーモード用の標準的なパイプラインps_pipeps_pipe PSPIPE_STANDARD PSPIPE_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_BASEPSFUNC_TEX_2NDPSFUNC_TEX_2ND // 2 // 2 番目のテクスチャ使用番目のテクスチャ使用PSFUNC_TEX_SHADOWMAPPSFUNC_TEX_SHADOWMAPPSFUNC_TEX_ENVPSFUNC_TEX_ENVPSFUNC_TEX_BASEALPHAPSFUNC_TEX_BASEALPHA // // ベーステクスチャベーステクスチャ αα 使用法使用法PSFUNC_OPACITYPSFUNC_OPACITY // // 半透明描画の場合に別の専用処理をする場合の種別半透明描画の場合に別の専用処理をする場合の種別

}}

// // シャドウマップ作成レンダーモード用パイプラインシャドウマップ作成レンダーモード用パイプラインps_pipeps_pipe PSPIPE_SHADOWMAP PSPIPE_SHADOWMAP{{

codecode PSPIPE_STD_SHADOWMAP.hPSPIPE_STD_SHADOWMAP.h // // 当該パイプラインで共通のコード部当該パイプラインで共通のコード部

PSFUNC_SHMAP_TEX_BASEALPHAPSFUNC_SHMAP_TEX_BASEALPHA // // ベーステクスチャベーステクスチャ αα を不透明度として利用するかを不透明度として利用するか}}

// // 屈折レンダリングパイプライン屈折レンダリングパイプラインps_pipeps_pipe PSPIPE_REFRACTION PSPIPE_REFRACTION{{

codecode PSPIPE_STD_REFRACTION.hPSPIPE_STD_REFRACTION.h // // 当該パイプラインで共通のコード部当該パイプラインで共通のコード部

PSFUNC_SHMAP_TEX_BASEALPHAPSFUNC_SHMAP_TEX_BASEALPHA // // ベースベース αα を不透明度として利用するかを不透明度として利用するか}}

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

頂点ファンクション頂点ファンクション定義定義

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//--------------------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------------------// // 頂点シェーダパイプライン内の各機能の種別定義頂点シェーダパイプライン内の各機能の種別定義

// // 頂点圧縮解凍/アニメーション頂点圧縮解凍/アニメーションvs_functionvs_function VSFUNC_ANIMATION VSFUNC_ANIMATION{{

VSFRG_ANM_NONEVSFRG_ANM_NONEVSFRG_ANM_WINDSWAYVSFRG_ANM_WINDSWAY // // 風による揺れアニメーション風による揺れアニメーションVSFRG_ANM_SKIN_WGT4_PVSFRG_ANM_SKIN_WGT4_P // // 行列パレットスキニング行列パレットスキニング (( ウェイトウェイト 4)4)

}}

// // 座標変換座標変換vs_functionvs_function VSFUNC_TRANSFORM VSFUNC_TRANSFORM{{

VSFRG_XFORM_WVPVSFRG_XFORM_WVP // // 通常のワールド/ビュー/プロジェクション変換通常のワールド/ビュー/プロジェクション変換}}

// // 頂点カラー情報頂点カラー情報vs_functionvs_function VSFUNC_VERTEXCOLOR VSFUNC_VERTEXCOLOR{{

VSFRG_VCOLOR_NONEVSFRG_VCOLOR_NONE // // 頂点カラーなし頂点カラーなし}}

// // ライティング種別ライティング種別vs_functionvs_function VSFUNC_LIGHTING VSFUNC_LIGHTING{{

// // 半球ライティング+半球ライティング+VSFRG_LIT_D2VSFRG_LIT_D2 // // 平行光源 平行光源 2 2 個個VSFRG_LIT_D3VSFRG_LIT_D3 // // 平行光源 平行光源 3 3 個個VSFRG_LIT_D4VSFRG_LIT_D4 // // 平行光源 平行光源 4 4 個個VSFRG_LIT_D2_P1VSFRG_LIT_D2_P1 // // 平行光源 平行光源 3 3 個 個 + + 点光源 点光源 1 1 個個VSFRG_LIT_D2_P2VSFRG_LIT_D2_P2 // // 平行光源 平行光源 2 2 個 個 + + 点光源 点光源 2 2 個個

}}

// // ライトマップ/ディティールテクスチャマップ種別ライトマップ/ディティールテクスチャマップ種別vs_functionvs_function VSFUNC_TEX_2ND VSFUNC_TEX_2ND{{

VSFRG_TEX_2ND_NONEVSFRG_TEX_2ND_NONE // // セカンダリテクスチャなしセカンダリテクスチャなしVSFRG_TEX_2ND_TEXCOORD0VSFRG_TEX_2ND_TEXCOORD0 // // ベーステクスチャと同じ座標を出力ベーステクスチャと同じ座標を出力VSFRG_TEX_2ND_TEXCOORD1VSFRG_TEX_2ND_TEXCOORD1 // // テクスチャ座標 テクスチャ座標 2 2 を使用を使用VSFRG_TEX_2ND_M42_UVVSFRG_TEX_2ND_M42_UV // // 変換行列による頂点座標変換を使用変換行列による頂点座標変換を使用 (4x2 (4x2 行列で 行列で uv uv 出力出力 ))

}}

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

頂点ファンクション頂点ファンクション定義(2)定義(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

// // シャドウマップテクスチャ座標シャドウマップテクスチャ座標vs_functionvs_function VSFUNC_TEX_SHADOWMAP VSFUNC_TEX_SHADOWMAP{{

VSFRG_TEX_SHADOW_NONEVSFRG_TEX_SHADOW_NONE // // シャドウマップ出力なしシャドウマップ出力なしVSFRG_TEX_SHADOW_M44_UVWQVSFRG_TEX_SHADOW_M44_UVWQ // // シャドウマップテクスチャ座標出力シャドウマップテクスチャ座標出力 (4x4 (4x4 射影行列で 射影行列で uvwq uvwq 出力出力 ))VSFRG_TEX_SHADOW_M44_UVWQ_SPOTLIGHTVSFRG_TEX_SHADOW_M44_UVWQ_SPOTLIGHT // // スポットシェーディング付きライトマップテクスチャ座標出力スポットシェーディング付きライトマップテクスチャ座標出力

// (4x4 // (4x4 射影行列で 射影行列で uvwq uvwq 出力出力 ))}}

// // 環境マップテクスチャ座標環境マップテクスチャ座標// // 環境マップおよびマテリアル制御環境マップおよびマテリアル制御vs_functionvs_function VSFUNC_TEX_ENVMAP VSFUNC_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_APPROXLOCAL VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCAL // // 動的キューブマッピング/メタリックツートンカラー動的キューブマッピング/メタリックツートンカラー

// (// ( 反射ベクトルのローカル近似補正あり反射ベクトルのローカル近似補正あり ))}}

// oD0 // oD0 出力制御出力制御 (( 輝度輝度 ))vs_functionvs_function VSFUNC_OUTD0ALPHA VSFUNC_OUTD0ALPHA{{

VSFRG_OD0A_DIFFUSEALPHAVSFRG_OD0A_DIFFUSEALPHA // // マテリアルのディフューズマテリアルのディフューズ αα 設定をそのまま出力設定をそのまま出力 (( 輝度輝度 ))}}

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

ピクセルファンクションピクセルファンクション定義定義//--------------------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------------------// // ピクセルシェーダパイプライン内の各機能の種別定義ピクセルシェーダパイプライン内の各機能の種別定義

// // ベーステクスチャマップファンクションベーステクスチャマップファンクションps_functionps_function PSFUNC_TEX_BASE PSFUNC_TEX_BASE{{

PSFRG_TEX_BASE_DIFFUSEPSFRG_TEX_BASE_DIFFUSE // // ベーステクスチャのディフューズモデュレートベーステクスチャのディフューズモデュレート}}

// 2 // 2 番目のテクスチャマップファンクション番目のテクスチャマップファンクションps_functionps_function PSFUNC_TEX_2ND PSFUNC_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_SHADOWMAP PSFUNC_TEX_SHADOWMAP{{

PSFRG_TEX_SHADOWMAP_NONEPSFRG_TEX_SHADOWMAP_NONE // // シャドウマップなしシャドウマップなしPSFRG_TEX_SHADOWMAP_SHADOWMAPPSFRG_TEX_SHADOWMAP_SHADOWMAP // // シャドウマップシャドウマップ

}}

// // 環境テクスチャマップファンクション環境テクスチャマップファンクションps_functionps_function PSFUNC_TEX_ENV PSFUNC_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 CO.,LTD. CO.,LTD.

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

ピクセルファンクションピクセルファンクション定義定義(2)(2)

// // ベーステクスチャベーステクスチャ αα 使用法使用法ps_functionps_function PSFUNC_TEX_BASEALPHA PSFUNC_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 パス処理を行う場合は パス処理を行う場合は 2 2 パス目を パス目を PSFRG_OPAC_NONE PSFRG_OPAC_NONE に修正してレンダリングするに修正してレンダリングするps_functionps_function PSFUNC_OPACITY PSFUNC_OPACITY{{

PSFRG_OPAC_NONEPSFRG_OPAC_NONE // // 通常の不透明もしくは半透明でも共通に利用できるマテリアル通常の不透明もしくは半透明でも共通に利用できるマテリアルPSFRG_OPAC_GLASS_TMPSFRG_OPAC_GLASS_TM // // ガラスガラス (( 半透明環境マップ半透明環境マップ )) のシングルパス描画のシングルパス描画 (( トーンマップ処理まで行うトーンマップ処理まで行う ))

}}

//--------------------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------------------// // シャドウ/屈折ピクセルシェーダパイプライン内各機能の種別定義シャドウ/屈折ピクセルシェーダパイプライン内各機能の種別定義

// // ベーステクスチャベーステクスチャ αα 使用法使用法ps_functionps_function PSFUNC_SHMAP_TEX_BASEALPHA PSFUNC_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 CO.,LTD. CO.,LTD.

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

頂点フラグメント定義頂点フラグメント定義//------------------------------------------------------------------//------------------------------------------------------------------// // 頂点シェーダファンクション頂点シェーダファンクション (( 機能機能 ))毎の実際の機能フラグメント定義毎の実際の機能フラグメント定義////

//------------------------------------------------//------------------------------------------------// VSFUNC_LIGHTING : // VSFUNC_LIGHTING : ライティングフラグメントライティングフラグメント

// // 半球ライティング 半球ライティング ++// // プライマリライティングとして平行光源 プライマリライティングとして平行光源 1 1 個 個 ++// // 追加平行光源 追加平行光源 1 1 個個vs_fragmentvs_fragment VSFRG_LIT_D2 VSFRG_LIT_D2{{

defdef #define LIT_NUM_ADDITIVE_LIGHTS_1#define LIT_NUM_ADDITIVE_LIGHTS_1}}

// // 半球ライティング 半球ライティング ++// // プライマリライティングとして平行光源 プライマリライティングとして平行光源 1 1 個 個 ++// // 追加平行光源 追加平行光源 1 1 個 個 + + 追加平行光源 追加平行光源 1 1 個個vs_fragmentvs_fragment VSFRG_LIT_D3 VSFRG_LIT_D3{{

defdef #define LIT_NUM_ADDITIVE_LIGHTS_2#define LIT_NUM_ADDITIVE_LIGHTS_2}}

// // 半球ライティング 半球ライティング ++// // プライマリライティングとして平行光源 プライマリライティングとして平行光源 1 1 個 個 ++// // 追加平行光源 追加平行光源 1 1 個 個 + + 追加平行光源 追加平行光源 2 2 個個vs_fragmentvs_fragment VSFRG_LIT_D4 VSFRG_LIT_D4{{

defdef #define LIT_NUM_ADDITIVE_LIGHTS_3#define LIT_NUM_ADDITIVE_LIGHTS_3}}

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

// // 半球ライティング 半球ライティング ++// // プライマリライティングとして平行光源 プライマリライティングとして平行光源 1 1 個 個 ++// // 追加平行光源 追加平行光源 1 1 個 個 + + 追加点光源 追加点光源 1 1 個個vs_fragmentvs_fragment VSFRG_LIT_D2_P1 VSFRG_LIT_D2_P1{{

defdef #define LIT_NUM_ADDITIVE_LIGHTS_2#define LIT_NUM_ADDITIVE_LIGHTS_2

// // 追加光源の最後の 追加光源の最後の 1 1 つは点光源につは点光源にdefdef #define LIT_ADDITIVE_2_POINT#define LIT_ADDITIVE_2_POINT

}}

// // 半球ライティング 半球ライティング ++// // プライマリライティングとして平行光源 プライマリライティングとして平行光源 1 1 個 個 ++// // 追加平行光源 追加平行光源 1 1 個 個 + + 追加点光源 追加点光源 2 2 個個vs_fragmentvs_fragment VSFRG_LIT_D2_P2 VSFRG_LIT_D2_P2{{

defdef #define LIT_NUM_ADDITIVE_LIGHTS_3#define LIT_NUM_ADDITIVE_LIGHTS_3

// // 追加光源の最後の 追加光源の最後の 2 2 つは点光源につは点光源にdefdef #define LIT_ADDITIVE_2_POINT#define LIT_ADDITIVE_2_POINTdefdef #define LIT_ADDITIVE_3_POINT#define LIT_ADDITIVE_3_POINT

}}

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

頂点フラグメント定義(2)頂点フラグメント定義(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//------------------------------------------------//------------------------------------------------// VSFUNC_TEX_2ND : // VSFUNC_TEX_2ND : ライトマップ/ディティールマップ種別ライトマップ/ディティールマップ種別

// // セカンダリテクスチャ座標なしセカンダリテクスチャ座標なしvs_fragmentvs_fragment VSFRG_TEX_2ND_NONE VSFRG_TEX_2ND_NONE{{}}

// // セカンダリテクスチャ座標にベーステクスチャと同じ座標を出力セカンダリテクスチャ座標にベーステクスチャと同じ座標を出力vs_fragmentvs_fragment VSFRG_TEX_2ND_TEXCOORD0 VSFRG_TEX_2ND_TEXCOORD0{{

defdef #define VS_TEX_2ND_TEXCOORD0#define VS_TEX_2ND_TEXCOORD0}}

// // セカンダリテクスチャ座標に セカンダリテクスチャ座標に 2 2 番目のテクスチャ座標を出力番目のテクスチャ座標を出力vs_fragmentvs_fragment VSFRG_TEX_2ND_TEXCOORD1 VSFRG_TEX_2ND_TEXCOORD1{{

defdef #define VS_TEX_2ND_TEXCOORD1#define VS_TEX_2ND_TEXCOORD1}}

// // モデル系頂点座標を モデル系頂点座標を 4x2 4x2 行列で変換した 行列で変換した uv uv 座標を出力座標を出力vs_fragmentvs_fragment VSFRG_TEX_2ND_M42_UV VSFRG_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_NONE VSFRG_TEX_SHADOW_NONE{{}}

// // モデル系頂点座標を モデル系頂点座標を 4x4 4x4 行列で変換した 行列で変換した uvwq uvwq 座標を出力座標を出力vs_fragmentvs_fragment VSFRG_TEX_SHADOW_M44_UVWQ VSFRG_TEX_SHADOW_M44_UVWQ{{

defdef #define VS_TEX_SHADOW_M44_UVWQ#define VS_TEX_SHADOW_M44_UVWQ}}

// // スポットライトマップテクスチャ座標出力スポットライトマップテクスチャ座標出力 (4x4 (4x4 射影行列で 射影行列で uvwq uvwq 出力出力 ))// // ライティング処理による ライティング処理による w w 座標の補正等が入る座標の補正等が入るvs_fragmentvs_fragment VSFRG_TEX_SHADOW_M44_UVWQ_SPOTLIGHT VSFRG_TEX_SHADOW_M44_UVWQ_SPOTLIGHT{{

defdef #define VS_TEX_SHADOW_M44_UVWQ_SPOTLIGH#define VS_TEX_SHADOW_M44_UVWQ_SPOTLIGHTT}}

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

頂点フラグメント定義(3)頂点フラグメント定義(3)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//------------------------------------------------//------------------------------------------------// VSFUNC_TEX_ENVMAP : // VSFUNC_TEX_ENVMAP : 環境マップテクスチャ座標/マテリアル制御環境マップテクスチャ座標/マテリアル制御

// // 環境マップなし/ライティングは通常のディフューズ環境マップなし/ライティングは通常のディフューズvs_fragmentvs_fragment VSFRG_TEX_ENV_NONE VSFRG_TEX_ENV_NONE{{}}// // 環境マップなし/ダイレクトカラーマテリアル環境マップなし/ダイレクトカラーマテリアルvs_fragmentvs_fragment VSFRG_TEX_ENV_NONE_MATRL_CONSTANTCOLOR VSFRG_TEX_ENV_NONE_MATRL_CONSTANTCOLOR{{

defdef #define VS_MATRL_CONSTANTCOLOR#define VS_MATRL_CONSTANTCOLOR

!disable!disable VSFRG_TEX_SHADOW_NONE VSFRG_TEX_SHADOW_NONE // // シャドウ無効シャドウ無効// // セカンダリテクスチャ無効セカンダリテクスチャ無効!disable!disable VSFRG_TEX_2ND_NONE VSFRG_TEX_2ND_NONE

}}

// // 環境マップなし/固定シェードライティング環境マップなし/固定シェードライティング (( ビルボード ビルボード etc.)etc.)vs_fragmentvs_fragment VSFRG_TEX_ENV_NONE_MATRL_FIXEDDIFFUSE VSFRG_TEX_ENV_NONE_MATRL_FIXEDDIFFUSE{{

defdef #define VS_MATRL_FIXEDDIFFUSE#define VS_MATRL_FIXEDDIFFUSE}}

// // 動的環境マッピング動的環境マッピングvs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC VSFRG_TEX_ENV_DYNANIC{{

defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBE}}

// // 動的環境マッピング動的環境マッピング (( 反射ベクトルのローカル近似補正あり反射ベクトルのローカル近似補正あり ))vs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC_APPROXLOCAL VSFRG_TEX_ENV_DYNANIC_APPROXLOCAL{{

defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBEdefdef #define XFORM_ADJUST_ENV_REF#define XFORM_ADJUST_ENV_REF

}}

// // 動的環境マッピング動的環境マッピング (( 反射率固定反射率固定 ))vs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC_FIXEDREF VSFRG_TEX_ENV_DYNANIC_FIXEDREF{{

defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBEdefdef #define VS_TEX_ENV_FIXEDREFLECTANCE#define VS_TEX_ENV_FIXEDREFLECTANCE

}}

// // 静的環境マッピング静的環境マッピングvs_fragmentvs_fragment VSFRG_TEX_ENV_STATIC VSFRG_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_FIXEDREF VSFRG_TEX_ENV_STATIC_FIXEDREF{{

defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBEdefdef #define VS_TEX_ENV_FIXEDREFLECTANCE#define VS_TEX_ENV_FIXEDREFLECTANCE

}}

// // スフィアマッピング/メタリックツートンカラースフィアマッピング/メタリックツートンカラーvs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2 VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2{{

defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBEdefdef #define VS_MATRL_2TONE#define VS_MATRL_2TONEdefdef #define VS_MATRL_METALLIC#define VS_MATRL_METALLIC

!disable!disable VSFRG_VCOLOR_NONE VSFRG_VCOLOR_NONE // // 頂点カラー無しのみ頂点カラー無しのみ}}

// // スフィアマッピング/メタリックツートンカラースフィアマッピング/メタリックツートンカラー// // 反射ベクトルのローカル反射用近似用補正あり反射ベクトルのローカル反射用近似用補正ありvs_fragmentvs_fragment VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCAL VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCAL{{

defdef #define VS_TEX_ENV_CUBE#define VS_TEX_ENV_CUBEdefdef #define VS_MATRL_2TONE#define VS_MATRL_2TONEdefdef #define VS_MATRL_METALLIC#define VS_MATRL_METALLIC

!disable!disable VSFRG_VCOLOR_NONE VSFRG_VCOLOR_NONE // // 頂点カラー無しのみ頂点カラー無しのみ// // 反射ベクトルを近似補正する反射ベクトルを近似補正するdefdef #define XFORM_ADJUST_ENV_REF#define XFORM_ADJUST_ENV_REF

}}

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

ピクセルフラグメント定義ピクセルフラグメント定義//-----------------------------------------------------------------------//-----------------------------------------------------------------------// // ピクセルシェーダファンクションピクセルシェーダファンクション (( 機能機能 ))毎の実際の機能フラグメント定義毎の実際の機能フラグメント定義////

//------------------------------------------------//------------------------------------------------// PSFUNC_TEX_BASE : // PSFUNC_TEX_BASE : ベーステクスチャピクセルシェーダフラグメントベーステクスチャピクセルシェーダフラグメント

// // ベーステクスチャのディフューズモデュレートベーステクスチャのディフューズモデュレートps_fragmentps_fragment PSFRG_TEX_BASE_DIFFUSE PSFRG_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_NONE PSFRG_TEX_2ND_NONE{{}}

// 2 // 2 番目のテクスチャはベーステクスチャのモデュレーション番目のテクスチャはベーステクスチャのモデュレーション (( ディティールディティール等等 ))ps_fragmentps_fragment PSFRG_TEX_2ND_MODULATE PSFRG_TEX_2ND_MODULATE{{

defdef #define PS_TEX_MODULATE_DIFFUSE#define PS_TEX_MODULATE_DIFFUSE}}

// 2 // 2 番目のテクスチャは焼付けシャドウ/ライトマップ番目のテクスチャは焼付けシャドウ/ライトマップps_fragmentps_fragment PSFRG_TEX_2ND_LIGHTMAP PSFRG_TEX_2ND_LIGHTMAP{{

defdef #define PS_TEX_LIGHT_PRIMARY#define PS_TEX_LIGHT_PRIMARY}}

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//------------------------------------------------//------------------------------------------------// PSFRG_TEX_SHADOWMAP : // PSFRG_TEX_SHADOWMAP : シャドウマップフラグメントシャドウマップフラグメント

// // シャドウマップなしシャドウマップなしps_fragmentps_fragment PSFRG_TEX_SHADOWMAP_NONE PSFRG_TEX_SHADOWMAP_NONE{{}}

// // シャドウマップありシャドウマップありps_fragmentps_fragment PSFRG_TEX_SHADOWMAP_SHADOWMAP PSFRG_TEX_SHADOWMAP_SHADOWMAP{{

defdef #define PS_TEX_SHADOW_PRIMAR#define PS_TEX_SHADOW_PRIMARYY}}

//------------------------------------------------//------------------------------------------------// PSFUNC_TEX_ENV : // PSFUNC_TEX_ENV : 環境マップピクセルシェーダフラグメント環境マップピクセルシェーダフラグメント

// // 環境マップテクスチャなし環境マップテクスチャなしps_fragmentps_fragment PSFRG_TEX_ENV_NONE PSFRG_TEX_ENV_NONE{{}}

// (// ( フレネル等のフレネル等の )) 反射率による環境マップ反射率による環境マップps_fragmentps_fragment PSFRG_TEX_ENV_REFLECT PSFRG_TEX_ENV_REFLECT{{

defdef #define PS_TEX_ENV_REFLECTAN#define PS_TEX_ENV_REFLECTANCECE}}

// // 加算系環境マップ加算系環境マップps_fragmentps_fragment PSFRG_TEX_ENV_ADD PSFRG_TEX_ENV_ADD{{

defdef #define PS_TEX_ENV_ADD#define PS_TEX_ENV_ADD}}

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

ピクセルフラグメント定義(2)ピクセルフラグメント定義(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//------------------------------------------------//------------------------------------------------// PSFUNC_TEX_ENV : // PSFUNC_TEX_ENV : ベーステクスチャベーステクスチャ αα 使用法使用法

// // ベーステクスチャベーステクスチャ αα は無視は無視ps_fragmentps_fragment PSFRG_TEX_BA_NONE PSFRG_TEX_BA_NONE{{}}

// // ベーステクスチャベーステクスチャ αα は不透明度として利用は不透明度として利用ps_fragmentps_fragment PSFRG_TEX_BA_OPACITY PSFRG_TEX_BA_OPACITY{{

defdef #define PS_TEX_OPACITY#define PS_TEX_OPACITY}}

// // ベーステクスチャベーステクスチャ αα はグロスはグロス (( 反射率反射率 )) として利用として利用ps_fragmentps_fragment PSFRG_TEX_BA_GLOSS PSFRG_TEX_BA_GLOSS{{

defdef #define PS_TEX_ENV_GLOSS#define PS_TEX_ENV_GLOSS

// // 環境マップマテリアルのみ有効環境マップマテリアルのみ有効disabledisable PSFRG_TEX_ENV_NONEPSFRG_TEX_ENV_NONE

}}

// // ベースベース αα は不透明度と補数グロスは不透明度と補数グロス (1-(1- 反射率反射率 )) として利用として利用ps_fragmentps_fragment PSFRG_TEX_BA_OPACITY_INVGLOSS PSFRG_TEX_BA_OPACITY_INVGLOSS{{

defdef #define PS_TEX_OPACITY#define PS_TEX_OPACITYdefdef #define PS_TEX_ENV_GLOSS_INV#define PS_TEX_ENV_GLOSS_INV

// // 環境マップマテリアルのみ有効環境マップマテリアルのみ有効disabledisable PSFRG_TEX_ENV_NONEPSFRG_TEX_ENV_NONE

}}

// // ベーステクスチャベーステクスチャ αα は自己照明度として利用は自己照明度として利用ps_fragmentps_fragment PSFRG_TEX_BA_ILLUM PSFRG_TEX_BA_ILLUM{{

defdef #define PS_TEX_ILLUM#define PS_TEX_ILLUM

// // 環境マップなしのマテリアルのみ有効環境マップなしのマテリアルのみ有効!disable!disable PSFRG_TEX_ENV_NONEPSFRG_TEX_ENV_NONE

}}

// // ベースベース αα は自己照明度と補数グロスは自己照明度と補数グロス (1-(1- 反射率反射率 )) として利用として利用ps_fragmentps_fragment PSFRG_TEX_BA_ILLUM_INVGLOSS PSFRG_TEX_BA_ILLUM_INVGLOSS{{

defdef #define PS_TEX_ILLUM#define PS_TEX_ILLUMdefdef #define PS_TEX_ENV_GLOSS_INV#define PS_TEX_ENV_GLOSS_INV

// // 反射率系環境マップのみ有効反射率系環境マップのみ有効disabledisable PSFRG_TEX_ENV_NONEPSFRG_TEX_ENV_NONE

}}

//------------------------------------------------//------------------------------------------------// PSFUNC_OPACITY : // PSFUNC_OPACITY : 半透明描画の場合に別の専用処理をする場合の種別半透明描画の場合に別の専用処理をする場合の種別

// // 通常の不透明もしくは半透明でも共通に利用できるマテリアル通常の不透明もしくは半透明でも共通に利用できるマテリアルps_fragmentps_fragment PSFRG_OPAC_NONE PSFRG_OPAC_NONE{{}}

// // ガラスガラス (( 半透明環境マップ半透明環境マップ )) のシングルパス描画のシングルパス描画 (( トーンマップ処理まで行トーンマップ処理まで行うう ))ps_fragmentps_fragment PSFRG_OPAC_GLASS_TM PSFRG_OPAC_GLASS_TM{{

defdef #define PS_GLASS_TM#define PS_GLASS_TM

// // 反射率系環境マップのみ有効反射率系環境マップのみ有効!disable!disable PSFRG_TEX_ENV_REFLECTPSFRG_TEX_ENV_REFLECT

}}

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

ピクセルフラグメント定義(3)ピクセルフラグメント定義(3)

//--------------------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------------------// // シャドウマップ生成ピクセルシェーダの各ファンクションのフラグメントシャドウマップ生成ピクセルシェーダの各ファンクションのフラグメント////

//------------------------------------------------//------------------------------------------------// PSFUNC_SHMAP_TEX_BASEALPHA : // PSFUNC_SHMAP_TEX_BASEALPHA : ベーステクスチャベーステクスチャ αα 使用法使用法

// // ベーステクスチャベーステクスチャ αα は無視は無視ps_fragmentps_fragment PSFRG_SHMAP_TEX_BA_NONE PSFRG_SHMAP_TEX_BA_NONE{{}}

// // ベーステクスチャベーステクスチャ αα は不透明度として利用は不透明度として利用ps_fragmentps_fragment PSFRG_SHMAP_TEX_BA_OPACITY PSFRG_SHMAP_TEX_BA_OPACITY{{

defdef #define PS_TEX_OPACITY#define PS_TEX_OPACITY}}

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

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

頂点シェーダ条件制御コード頂点シェーダ条件制御コード

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//------------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------------// "VS_SUBPROC\VS_STD_FLAGS.h"// "VS_SUBPROC\VS_STD_FLAGS.h"// // 頂点シェーダの動作制御フラグの作成コード頂点シェーダの動作制御フラグの作成コード (( 共通部共通部 ))////// // 処理制御フラグ処理制御フラグ// VS_ANM_WINDSWAY : // VS_ANM_WINDSWAY : 原点からの高さによる揺れアニメーション原点からの高さによる揺れアニメーション// ANM_SKIN_NUM_WEIGHTS_1 : // ANM_SKIN_NUM_WEIGHTS_1 : 実質ブレンドなしウェイト実質ブレンドなしウェイト 1 (1 1 (1 ボーンのみの影響を受けるボーンのみの影響を受ける ))// ANM_SKIN_NUM_WEIGHTS_2-4 : // ANM_SKIN_NUM_WEIGHTS_2-4 : スキニングブレンドウェイトスキニングブレンドウェイト 2-4 (2-4 2-4 (2-4 ボーンの影響を受けるボーンの影響を受ける ))// VS_VCOLOR_PRESHADOW : // VS_VCOLOR_PRESHADOW : 頂点カラーに前計算のプライマリライト用シャドウ頂点カラーに前計算のプライマリライト用シャドウ// VS_VCOLOR_DIFFUSE : // VS_VCOLOR_DIFFUSE : 頂点カラーディフューズ乗算頂点カラーディフューズ乗算// LIT_NUM_ADDITIVE_LIGHT_n : // LIT_NUM_ADDITIVE_LIGHT_n : 追加光源の数追加光源の数 (n = 0 (n = 0 ~ ~ 3 3 を定義を定義 ))// // 未定義時はゼロとみなす未定義時はゼロとみなす// LIT_ADDITIVE_1_POINT : // LIT_ADDITIVE_1_POINT : 追加光源追加光源 11 に点光源を使用に点光源を使用// LIT_ADDITIVE_2_POINT : // LIT_ADDITIVE_2_POINT : 追加光源追加光源 22 に点光源を使用に点光源を使用// LIT_ADDITIVE_3_POINT : // LIT_ADDITIVE_3_POINT : 追加光源追加光源 33 に点光源を使用に点光源を使用// LIT_ADDITIVE_HEMISPHERE : // LIT_ADDITIVE_HEMISPHERE : 追加光源の結果に環境光半球ライトを追加する追加光源の結果に環境光半球ライトを追加する// VS_TEX_2ND_TEXCOORD0 : // VS_TEX_2ND_TEXCOORD0 : セカンダリテクスチャ座標セカンダリテクスチャ座標 (oT2)(oT2) にベーステクスチャと同じ値を出力にベーステクスチャと同じ値を出力// VS_TEX_2ND_TEXCOORD1 : // VS_TEX_2ND_TEXCOORD1 : セカンダリテクスチャ座標セカンダリテクスチャ座標 (oT2)(oT2) に に VSV_TEXCOORD1 VSV_TEXCOORD1 を出力を出力// VS_TEX_2ND_M42_UV : // VS_TEX_2ND_M42_UV : セカンダリテクスチャ座標セカンダリテクスチャ座標 (oT2)(oT2) に に 4x2 4x2 行列による 行列による uv uv 座標を出力座標を出力// VS_TEX_SHADOW_M44_UVWQ : // VS_TEX_SHADOW_M44_UVWQ : シャドウマップ座標シャドウマップ座標 (oT3)(oT3) に に 4x4 4x4 行列による 行列による uvwq uvwq 座標を出力座標を出力// VS_TEX_SHADOW_M44_UVWQ_SPOTLIGHT : // VS_TEX_SHADOW_M44_UVWQ_SPOTLIGHT : テクスチャをスポットライトボリュームテクスチャとみなしテクスチャをスポットライトボリュームテクスチャとみなし// // スポットライトベクトルと法線の内積値 スポットライトベクトルと法線の内積値 < 0.0 < 0.0 の場合に の場合に w w に に q q 以上の値を出力以上の値を出力// VS_TEX_SHADOW_M44_UVWQ // VS_TEX_SHADOW_M44_UVWQ とは排他的とは排他的// VS_TEX_ENV_SPHERE : // VS_TEX_ENV_SPHERE : 環境マップ座標環境マップ座標 (oT1)(oT1) にスフィアマップ座標を出力にスフィアマップ座標を出力// VS_TEX_ENV_CUBE : // VS_TEX_ENV_CUBE : 環境マップ座標環境マップ座標 (oT1)(oT1) にキューブマップ座標を出力にキューブマップ座標を出力////// VS_MATRL_CONSTANTCOLOR : // VS_MATRL_CONSTANTCOLOR : 定数カラーマテリアル定数カラーマテリアル// LIT_OUTPUT_SEPARATE // LIT_OUTPUT_SEPARATE 定義時は 定義時は oD1 oD1 に出力に出力 (( シャドウの影響を受けさせないためにシャドウの影響を受けさせないために ))// VS_MATRL_FIXEDDIFFUSE : // VS_MATRL_FIXEDDIFFUSE : 定数シェードマテリアル定数シェードマテリアル (( 光源の影響は受けるが法線と無関係に固定ライティング光源の影響は受けるが法線と無関係に固定ライティング ))// VS_MATRL_2TONE : // VS_MATRL_2TONE : ツートンカラーツートンカラー// // 頂点カラーとは排他的頂点カラーとは排他的 (VS_VCOLOR_NONE (VS_VCOLOR_NONE のみのみ ))// VS_MATRL_METALLIC : // VS_MATRL_METALLIC : カラーラフスペキュラー付きメタリックマテリアルカラーラフスペキュラー付きメタリックマテリアル// // 通常 通常 VS_MATRL_2TONE VS_MATRL_2TONE と併用と併用// VS_OD0A_CAMERASPOT : // VS_OD0A_CAMERASPOT : カメラの方向を向いた時に高いカメラの方向を向いた時に高い αα値を出力値を出力 (( 指向性ライトの輝度指向性ライトの輝度 ::ヘッドライトヘッドライト ))// // 未定義時は固定のディフューズ未定義時は固定のディフューズ αα値を出力値を出力

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

頂点シェーダ条件制御コード頂点シェーダ条件制御コード(2)(2)

//----------------------------------------------//----------------------------------------------// // スクリーンスペースシェーダが有効かスクリーンスペースシェーダが有効か

#ifndef#ifndef SCREENSPACE SCREENSPACE#ifndef#ifndef XFORM_DISABLE_VIEWPORT XFORM_DISABLE_VIEWPORT#define#define XFORM_DISABLE_VIEWPORT XFORM_DISABLE_VIEWPORT#endif#endif // #ifndef XFORM_DISABLE_VIEWPORT// #ifndef XFORM_DISABLE_VIEWPORT

#endif#endif // #ifndef SCREENSPACE// #ifndef SCREENSPACE

//----------------------------------------------//----------------------------------------------// // 頂点アニメーション/圧縮解凍制御頂点アニメーション/圧縮解凍制御

#ifdef#ifdef ANM_SKIN_NUM_WEIGHTS_1 ANM_SKIN_NUM_WEIGHTS_1#define#define VS_ANM_SKIN VS_ANM_SKIN

#endif#endif // #ifdef ANM_SKIN_NUM_WEIGHTS_1// #ifdef ANM_SKIN_NUM_WEIGHTS_1#ifdef#ifdef ANM_SKIN_NUM_WEIGHTS_2 ANM_SKIN_NUM_WEIGHTS_2

#define#define VS_ANM_SKIN VS_ANM_SKIN#endif#endif // #ifdef ANM_SKIN_NUM_WEIGHTS_2// #ifdef ANM_SKIN_NUM_WEIGHTS_2#ifdef#ifdef ANM_SKIN_NUM_WEIGHTS_3 ANM_SKIN_NUM_WEIGHTS_3

#define#define VS_ANM_SKIN VS_ANM_SKIN#endif#endif // #ifdef ANM_SKIN_NUM_WEIGHTS_3// #ifdef ANM_SKIN_NUM_WEIGHTS_3#ifdef#ifdef ANM_SKIN_NUM_WEIGHTS_4 ANM_SKIN_NUM_WEIGHTS_4

#define#define VS_ANM_SKIN VS_ANM_SKIN#endif#endif // #ifdef ANM_SKIN_NUM_WEIGHTS_4// #ifdef ANM_SKIN_NUM_WEIGHTS_4

// // アニメーションが一切定義されていない場合アニメーションが一切定義されていない場合#ifndef#ifndef VS_ANM_WINDSWAY VS_ANM_WINDSWAY#ifndef#ifndef VS_ANM_SKIN VS_ANM_SKIN

#define#define VS_ANM_NONE VS_ANM_NONE#endif#endif // #ifndef VS_ANM_SKIN// #ifndef VS_ANM_SKIN#endif#endif // #ifndef VS_ANM_WINDSWAY// #ifndef VS_ANM_WINDSWAY

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//----------------------------------------------//----------------------------------------------// // カラーセパレート出力制御カラーセパレート出力制御// PSPIPE_STANDARD.h// PSPIPE_STANDARD.h// #define PS_ADDITIVE_LIGHT// #define PS_ADDITIVE_LIGHT// // と対応していることと対応していること#ifndef#ifndef LIT_OUTPUT_SEPARATE LIT_OUTPUT_SEPARATE#define#define LIT_OUTPUT_SEPARATE LIT_OUTPUT_SEPARATE#endif#endif // #ifndef LIT_OUTPUT_SEPARATE// #ifndef LIT_OUTPUT_SEPARATE

// // 固定ライティング以外なら固定ライティング以外なら// // 半球ライティング有効半球ライティング有効#ifndef#ifndef LIT_ADDITIVE_HEMISPHERE LIT_ADDITIVE_HEMISPHERE#define#define LIT_ADDITIVE_HEMISPHERE LIT_ADDITIVE_HEMISPHERE#endif#endif // #ifndef LIT_ADDITIVE_HEMISPHERE// #ifndef LIT_ADDITIVE_HEMISPHERE

// // 半球ライティングを無効にする半球ライティングを無効にする//#undef LIT_ADDITIVE_HEMISPHERE//#undef LIT_ADDITIVE_HEMISPHERE

// // スクリーンスペースオフセットスクリーンスペースオフセット ((zオフセット/zオフセット/ Fat)Fat) を無効にするを無効にする//#define VS_DISABLE_SCREENSPACE_OFFSET//#define VS_DISABLE_SCREENSPACE_OFFSET

//----------------------------------------------//----------------------------------------------// // 頂点カラー制御頂点カラー制御#ifndef#ifndef VS_VCOLOR_PRESHADOW VS_VCOLOR_PRESHADOW#ifndef#ifndef VS_VCOLOR_DIFFUSE VS_VCOLOR_DIFFUSE

// // 頂点カラーなし頂点カラーなし#define#define VS_VCOLOR_NONE VS_VCOLOR_NONE

#endif#endif // #ifndef VS_VCOLOR_DIFFUSE// #ifndef VS_VCOLOR_DIFFUSE#endif#endif // #ifndef VS_VCOLOR_PRESHADOW// #ifndef VS_VCOLOR_PRESHADOW

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

頂点シェーダ条件制御コード(3)頂点シェーダ条件制御コード(3)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//----------------------------------------------//----------------------------------------------// // セカンダリテクスチャ座標制御セカンダリテクスチャ座標制御#ifndef#ifndef VS_TEX_2ND_TEXCOORD0 VS_TEX_2ND_TEXCOORD0#ifndef#ifndef VS_TEX_2ND_TEXCOORD1 VS_TEX_2ND_TEXCOORD1#ifndef#ifndef VS_TEX_2ND_M42_UV VS_TEX_2ND_M42_UV

// // セカンダリテクスチャ座標出力なしセカンダリテクスチャ座標出力なし#define#define VS_TEX_2ND_NONE VS_TEX_2ND_NONE

#endif#endif // #ifndef VS_TEX_2ND_M42_UV// #ifndef VS_TEX_2ND_M42_UV#endif#endif // #ifndef VS_TEX_2ND_TEXCOORD1// #ifndef VS_TEX_2ND_TEXCOORD1#endif#endif // #ifndef VS_TEX_2ND_TEXCOORD0// #ifndef VS_TEX_2ND_TEXCOORD0

//----------------------------------------------//----------------------------------------------// // シャドウマップテクスチャ座標制御シャドウマップテクスチャ座標制御#ifndef#ifndef VS_TEX_SHADOW_M44_UVWQ VS_TEX_SHADOW_M44_UVWQ#ifndef#ifndef VS_TEX_SHADOW_M44_UVWQ_SPOTLIGHT VS_TEX_SHADOW_M44_UVWQ_SPOTLIGHT

// // シャドウマップ座標出力なしシャドウマップ座標出力なし#define#define VS_TEX_SHADOW_NONE VS_TEX_SHADOW_NONE

#endif#endif // #ifndef VS_TEX_SHADOW_M44_UVWQ_SPOTLIGHT// #ifndef VS_TEX_SHADOW_M44_UVWQ_SPOTLIGHT#endif#endif // #ifndef VS_TEX_SHADOW_M44_UVWQ// #ifndef VS_TEX_SHADOW_M44_UVWQ

//----------------------------------------------//----------------------------------------------// // 環境マップテクスチャ座標制御環境マップテクスチャ座標制御#ifndef#ifndef VS_TEX_ENV_SPHERE VS_TEX_ENV_SPHERE#ifndef#ifndef VS_TEX_ENV_CUBE VS_TEX_ENV_CUBE

// // 環境マップテクスチャ座標出力なし環境マップテクスチャ座標出力なし#define#define VS_TEX_ENV_NONE VS_TEX_ENV_NONE

#endif#endif // #ifndef VS_TEX_ENV_CUBE// #ifndef VS_TEX_ENV_CUBE#endif#endif // #ifndef VS_TEX_ENV_SPHERE// #ifndef VS_TEX_ENV_SPHERE

//----------------------------------------------//----------------------------------------------// // マテリアル制御マテリアル制御

// // ツートンメタリックならメタリックもオンツートンメタリックならメタリックもオン#ifdef#ifdef VS_MATRL_METALLIC2TONE VS_MATRL_METALLIC2TONE

#ifndef#ifndef VS_MATRL_METALLIC VS_MATRL_METALLIC#define#define VS_MATRL_METALLIC VS_MATRL_METALLIC#endif#endif // #ifndef VS_MATRL_METALLIC// #ifndef VS_MATRL_METALLIC

#endif#endif // #ifdef VS_MATRL_METALLIC2TONE// #ifdef VS_MATRL_METALLIC2TONE

// // 通常のライティング通常のライティング// #include "VS_SUBPROC\VS_STD_LIT.h"// #include "VS_SUBPROC\VS_STD_LIT.h"// // で処理する条件で処理する条件// // 定数カラーでも定数ライティングでもない場合定数カラーでも定数ライティングでもない場合#ifndef#ifndef VS_MATRL_CONSTANTCOLOR VS_MATRL_CONSTANTCOLOR#ifndef#ifndef VS_MATRL_FIXEDDIFFUSE VS_MATRL_FIXEDDIFFUSE

#define#define VS_LIT_STD_PROC VS_LIT_STD_PROC#endif#endif // #ifndef VS_MATRL_FIXEDDIFFUSE// #ifndef VS_MATRL_FIXEDDIFFUSE#endif#endif // #ifndef VS_MATRL_CONSTANTCOLOR// #ifndef VS_MATRL_CONSTANTCOLOR

//----------------------------------------------//----------------------------------------------// // カメラスペース視線反射ベクトルの計算カメラスペース視線反射ベクトルの計算// // 環境マップ環境マップ (( ただし平面反射は除くただし平面反射は除く ))#ifdef#ifdef VS_TEX_ENV_SPHERE VS_TEX_ENV_SPHERE

#ifndef#ifndef XFORM_CAMERA_REFLECTION XFORM_CAMERA_REFLECTION#define#define XFORM_CAMERA_REFLECTION XFORM_CAMERA_REFLECTION#endif#endif // #ifndef XFORM_CAMERA_REFLECTION// #ifndef XFORM_CAMERA_REFLECTION

#endif#endif // VS_TEX_ENV_SPHERE// VS_TEX_ENV_SPHERE

#ifdef#ifdef VS_TEX_ENV_CUBE VS_TEX_ENV_CUBE#ifndef#ifndef XFORM_CAMERA_REFLECTION XFORM_CAMERA_REFLECTION#define#define XFORM_CAMERA_REFLECTION XFORM_CAMERA_REFLECTION#endif#endif // #ifndef XFORM_CAMERA_REFLECTION// #ifndef XFORM_CAMERA_REFLECTION

#endif#endif // VS_TEX_ENV_CUBE// VS_TEX_ENV_CUBE

// // カメラに向く程明るくなる指向性ライトカメラに向く程明るくなる指向性ライト#ifdef#ifdef VS_OD0A_CAMERASPOT VS_OD0A_CAMERASPOT

#ifndef#ifndef XFORM_CAMERA_NE XFORM_CAMERA_NE#define#define XFORM_CAMERA_NE XFORM_CAMERA_NE#endif#endif // #ifndef XFORM_CAMERA_NE// #ifndef XFORM_CAMERA_NE

#endif#endif // VS_OD0A_CAMERASPOT// VS_OD0A_CAMERASPOT

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

頂点シェーダコード頂点シェーダコード//------------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------------// "VSPIPE_STANDARD.h"// "VSPIPE_STANDARD.h"// // 標準的な頂点シェーダパイプラインの共通コード標準的な頂点シェーダパイプラインの共通コード////

//---------------------------------------------------------------------------//---------------------------------------------------------------------------// // 指定されたフラグにより必要な処理制御フラグをセット指定されたフラグにより必要な処理制御フラグをセット#include#include "VS_SUBPROC\VS_STD_FLAGS.h" "VS_SUBPROC\VS_STD_FLAGS.h"

//-----------------------------------------------------------//-----------------------------------------------------------// // 頂点座標解凍/アニメーション頂点座標解凍/アニメーション#include#include "VS_SUBPROC\VS_STD_ANM.h" "VS_SUBPROC\VS_STD_ANM.h"

//-----------------------------------------------------------//-----------------------------------------------------------// // 頂点座標変換頂点座標変換#include#include "VS_SUBPROC\VS_STD_XFORM.h" "VS_SUBPROC\VS_STD_XFORM.h"

//-----------------------------------------------------------//-----------------------------------------------------------// // 環境マップ座標生成環境マップ座標生成

// // 何らかの座標を出力する場合何らかの座標を出力する場合#ifndef#ifndef VS_TEX_ENV_NONE VS_TEX_ENV_NONE

#include#include "VS_SUBPROC\VS_STD_TEX_ENVMAP.h" "VS_SUBPROC\VS_STD_TEX_ENVMAP.h"#endif#endif // #ifndef VS_TEX_ENV_NONE// #ifndef VS_TEX_ENV_NONE

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

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

頂点シェーダコード(2)頂点シェーダコード(2)//-----------------------------------------------------------//-----------------------------------------------------------// // ライティングライティング#ifdef#ifdef VS_MATRL_2TONE VS_MATRL_2TONE

// // ツートンカラー制御ツートンカラー制御#define#define VSR_RGBA_MATERIAL_DIFFUSE VSRR_RGBA_MATERIAL_DIFFUSE VSR_RGBA_MATERIAL_DIFFUSE VSRR_RGBA_MATERIAL_DIFFUSE

movmov VSR_RGBA_MATERIAL_DIFFUSE, c[VSC_RGBA_MATERIAL_DIFFUSE] VSR_RGBA_MATERIAL_DIFFUSE, c[VSC_RGBA_MATERIAL_DIFFUSE]mulmul VSR_TEMP1.w, -__VSR_CAMERA_NE, -__VSR_CAMERA_NE VSR_TEMP1.w, -__VSR_CAMERA_NE, -__VSR_CAMERA_NEmadmad VSR_RGBA_MATERIAL_DIFFUSE.rgb, c[VSC_RGBA_MATERIAL_DIFFUSE2].rgb, VSR_TEMP1.w, VSR_RGBA_MATERIAL_DIFFUSE.rgb VSR_RGBA_MATERIAL_DIFFUSE.rgb, c[VSC_RGBA_MATERIAL_DIFFUSE2].rgb, VSR_TEMP1.w, VSR_RGBA_MATERIAL_DIFFUSE.rgb

#else#else // #ifdef VS_MATRL_2TONE// #ifdef VS_MATRL_2TONE

// // 頂点カラーなし頂点カラーなし#ifdef#ifdef VS_VCOLOR_NONE VS_VCOLOR_NONE

#define#define VSR_RGBA_MATERIAL_DIFFUSE c[VSC_RGBA_MATERIAL_DIFFUSE] VSR_RGBA_MATERIAL_DIFFUSE c[VSC_RGBA_MATERIAL_DIFFUSE]#endif#endif // #ifdef VS_VCOLOR_NONE// #ifdef VS_VCOLOR_NONE

// // 頂点カラーを焼付けシャドウとして利用頂点カラーを焼付けシャドウとして利用#ifdef#ifdef VS_VCOLOR_PRESHADOW VS_VCOLOR_PRESHADOW

#define#define VSR_RGBA_MATERIAL_DIFFUSE c[VSC_RGBA_MATERIAL_DIFFUSE] VSR_RGBA_MATERIAL_DIFFUSE c[VSC_RGBA_MATERIAL_DIFFUSE]#define#define LIT_VCOLOR_PRIMARY_PSHADOW LIT_VCOLOR_PRIMARY_PSHADOW

#endif#endif // #ifdef VS_VCOLOR_PRESHADOW// #ifdef VS_VCOLOR_PRESHADOW

// // 頂点カラーをディフューズモデュレートとして利用頂点カラーをディフューズモデュレートとして利用#ifdef#ifdef VS_VCOLOR_DIFFUSE VS_VCOLOR_DIFFUSE

#define#define VSR_RGBA_MATERIAL_DIFFUSE VSRR_RGBA_MATERIAL_DIFFUSE VSR_RGBA_MATERIAL_DIFFUSE VSRR_RGBA_MATERIAL_DIFFUSEmulmul VSR_RGBA_MATERIAL_DIFFUSE, c[VSC_RGBA_MATERIAL_DIFFUSE], VSV_DIFFUSE VSR_RGBA_MATERIAL_DIFFUSE, c[VSC_RGBA_MATERIAL_DIFFUSE], VSV_DIFFUSE

#endif#endif // #ifdef VS_VCOLOR_PRESHADOW// #ifdef VS_VCOLOR_PRESHADOW#endif#endif // #ifdef VS_MATRL_2TONE// #ifdef VS_MATRL_2TONE

// // 実際のライティング処理コード実際のライティング処理コード#ifdef#ifdef VS_MATRL_CONSTANTCOLOR VS_MATRL_CONSTANTCOLOR

// // カラーの直接出力カラーの直接出力#include#include "VS_SUBPROC\VS_STD_MTRL_CONST.h" "VS_SUBPROC\VS_STD_MTRL_CONST.h"

#endif#endif // #ifdef VS_MATRL_CONSTANTCOLOR// #ifdef VS_MATRL_CONSTANTCOLOR

#ifdef#ifdef VS_MATRL_FIXEDDIFFUSE VS_MATRL_FIXEDDIFFUSE// // 固定ライティング固定ライティング#include#include "VS_SUBPROC\VS_STD_LIT_FIXED.h" "VS_SUBPROC\VS_STD_LIT_FIXED.h"

#endif#endif // #ifdef VS_MATRL_FIXEDDIFFUSE// #ifdef VS_MATRL_FIXEDDIFFUSE

#ifdef#ifdef VS_LIT_STD_PROC VS_LIT_STD_PROC// // 通常のライティング通常のライティング (( メタリック含むメタリック含む ))#include#include "VS_SUBPROC\VS_STD_LIT.h" "VS_SUBPROC\VS_STD_LIT.h"

#endif#endif // #ifdef VS_LIT_STD_PROC// #ifdef VS_LIT_STD_PROC

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

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

頂点シェーダコード(3)頂点シェーダコード(3)//-----------------------------------------------------------//-----------------------------------------------------------// // ベーステクスチャ座標出力ベーステクスチャ座標出力madmad oT0.xy, VSV_TEXCOORD0, VSC_COMPRESS_SCALE_TEX_SCALE, VSC_COMPRESS_SCALE_TEX_BIAS oT0.xy, VSV_TEXCOORD0, VSC_COMPRESS_SCALE_TEX_SCALE, VSC_COMPRESS_SCALE_TEX_BIAS

//-----------------------------------------------------------//-----------------------------------------------------------// // セカンダリテクスチャ座標生成セカンダリテクスチャ座標生成// // ライトマップ/ディティールマップ ライトマップ/ディティールマップ etc.etc.

// // 何らかの座標を出力する場合何らかの座標を出力する場合#ifndef#ifndef VS_TEX_2ND_NONE VS_TEX_2ND_NONE

#include#include "VS_SUBPROC\VS_STD_TEX_2ND.h" "VS_SUBPROC\VS_STD_TEX_2ND.h"#endif#endif // #ifndef VS_TEX_2ND_NONE// #ifndef VS_TEX_2ND_NONE

//-----------------------------------------------------------//-----------------------------------------------------------// // シャドウマップ座標生成シャドウマップ座標生成

// // 何らかの座標を出力する場合何らかの座標を出力する場合#ifndef#ifndef VS_TEX_SHADOW_NONE VS_TEX_SHADOW_NONE

#include#include "VS_SUBPROC\VS_STD_TEX_SHADOWMAP.h" "VS_SUBPROC\VS_STD_TEX_SHADOWMAP.h"#endif#endif // #ifndef VS_TEX_2ND_NONE// #ifndef VS_TEX_2ND_NONE

//-----------------------------------------------------------//-----------------------------------------------------------// // フォグ フォグ w w 出力出力

// oPos.w // oPos.w を を oFog.x oFog.x ににmovmov oFog.x, VSR_HG_POSITION.w oFog.x, VSR_HG_POSITION.w

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

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

頂点シェーダファンクションコー頂点シェーダファンクションコードド

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//----------------------------------------------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------// "VS_SUBPROC\VS_STD_TEX_ENVMAP.h"// "VS_SUBPROC\VS_STD_TEX_ENVMAP.h"// // 環境マップテクスチャ座標出力環境マップテクスチャ座標出力////// // 必要なレジスタ必要なレジスタ// __VSR_CAMERA_REFLECTION : // __VSR_CAMERA_REFLECTION : カメラスペース視線反射ベクトルカメラスペース視線反射ベクトル (XFORM_CAMERA_REFLECTION (XFORM_CAMERA_REFLECTION 定義時定義時 ))// .xyz : // .xyz : 反射ベクトル反射ベクトル , .w : , .w : カメラスペース カメラスペース E.N(E E.N(E はカメラから頂点へ向かうベクトルはカメラから頂点へ向かうベクトル ))////// // 出力レジスタ出力レジスタ// oT1 : // oT1 : 環境マップテクスチャ座標環境マップテクスチャ座標 (TEX_ENV_COORD_OUTPUT (TEX_ENV_COORD_OUTPUT 定義時は定義に従う定義時は定義に従う ))// oD1.a : // oD1.a : フレネル反射係数フレネル反射係数 (TEX_ENV_REFLECTANCE_OUTPUT (TEX_ENV_REFLECTANCE_OUTPUT 定義時は定義に従う定義時は定義に従う ))////// // 処理制御フラグ処理制御フラグ// VS_TEX_ENV_SPHERE : // VS_TEX_ENV_SPHERE : 環境マップ座標環境マップ座標 (TEX_ENV_COORD_OUTPUT)(TEX_ENV_COORD_OUTPUT) にスフィアマップ座標を出力にスフィアマップ座標を出力// VS_TEX_ENV_CUBE : // VS_TEX_ENV_CUBE : 環境マップ座標環境マップ座標 (TEX_ENV_COORD_OUTPUT)(TEX_ENV_COORD_OUTPUT) にキューブマップ座標を出力にキューブマップ座標を出力// VS_TEX_ENV_FIXEDREFLECTANCE : // VS_TEX_ENV_FIXEDREFLECTANCE : フレネルを考慮せず、固定反射率フレネルを考慮せず、固定反射率 (c[VSC_FRESNEL_PARAM].x)(c[VSC_FRESNEL_PARAM].x) を出力を出力// TEX_ENV_COORD_OUTPUT : // TEX_ENV_COORD_OUTPUT : 環境マップ座標の出力レジスタ環境マップ座標の出力レジスタ ((未定義時は 未定義時は oT1)oT1)// TEX_ENV_REFLECTANCE_OUTPUT : // TEX_ENV_REFLECTANCE_OUTPUT : 鏡面反射率の出力レジスタ鏡面反射率の出力レジスタ ((未定義時は 未定義時は oD1.a)oD1.a)

// VS_TEX_ENV_FIXEDREFLECTANCE // VS_TEX_ENV_FIXEDREFLECTANCE 未定義ならフレネル有効未定義ならフレネル有効#ifndef#ifndef VS_TEX_ENV_FIXEDREFLECTANCE VS_TEX_ENV_FIXEDREFLECTANCE

#define#define VS_TEX_ENV_FRESNELREFLECTANCE VS_TEX_ENV_FRESNELREFLECTANCE#endif#endif // #ifndef VS_TEX_ENV_FIXEDREFLECTANCE// #ifndef VS_TEX_ENV_FIXEDREFLECTANCE

#ifndef#ifndef TEX_ENV_COORD_OUTPUT TEX_ENV_COORD_OUTPUT#define#define TEX_ENV_COORD_OUTPUT TEX_ENV_COORD_OUTPUT oT1oT1

#endif#endif // #ifndef TEX_ENV_COORD_OUTPUT// #ifndef TEX_ENV_COORD_OUTPUT

#ifndef#ifndef TEX_ENV_REFLECTANCE_OUTPUT TEX_ENV_REFLECTANCE_OUTPUT#define#define TEX_ENV_REFLECTANCE_OUTPUT TEX_ENV_REFLECTANCE_OUTPUT oD1.aoD1.a

#endif#endif // #ifndef TEX_ENV_REFLECTANCE_OUTPUT// #ifndef TEX_ENV_REFLECTANCE_OUTPUT

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

頂点シェーダファンクションコー頂点シェーダファンクションコード(2)ド(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

#define#define __TEX_OUT __TEX_OUT TEX_ENV_COORD_OUTPUTTEX_ENV_COORD_OUTPUT

#ifdef#ifdef VS_TEX_ENV_SPHERE VS_TEX_ENV_SPHERE // // スフィアマップスフィアマップsphmap_tsphmap_t __TEX_OUT, __VSR_CAMERA_REFLECTION, VSR_ILU_R1 __TEX_OUT, __VSR_CAMERA_REFLECTION, VSR_ILU_R1

#endif#endif // #ifdef VS_TEX_ENV_SPHERE// #ifdef VS_TEX_ENV_SPHERE

#ifdef#ifdef VS_TEX_ENV_CUBE VS_TEX_ENV_CUBE // // キューブマップキューブマップ// // カメラスペースからワールドスペースへ逆変換カメラスペースからワールドスペースへ逆変換tm3x3_ttm3x3_t __TEX_OUT, __VSR_CAMERA_REFLECTION, c[VSC_M43_VIEW], VSR_TEMP1 __TEX_OUT, __VSR_CAMERA_REFLECTION, c[VSC_M43_VIEW], VSR_TEMP1

#endif#endif // #ifdef VS_TEX_ENV_CUBE// #ifdef VS_TEX_ENV_CUBE

#undef#undef __TEX_OUT __TEX_OUT

#define#define __REFLECTANCE_OUT __REFLECTANCE_OUT TEX_ENV_REFLECTANCE_OUTPUTTEX_ENV_REFLECTANCE_OUTPUT

#ifdef#ifdef VS_TEX_ENV_FIXEDREFLECTANCE VS_TEX_ENV_FIXEDREFLECTANCEmovmov __REFLECTANCE_OUT, c[VSC_FRESNEL_PARAM].x __REFLECTANCE_OUT, c[VSC_FRESNEL_PARAM].x

#endif#endif // #ifdef VS_TEX_ENV_FIXEDREFLECTANCE// #ifdef VS_TEX_ENV_FIXEDREFLECTANCE

#ifdef#ifdef VS_TEX_ENV_FRESNELREFLECTANCE VS_TEX_ENV_FRESNELREFLECTANCE// // フレネル反射係数の計算フレネル反射係数の計算// oD1.w = fresnel reflection, VSR_TEMP2.x = 0 // oD1.w = fresnel reflection, VSR_TEMP2.x = 0 ~ ~ 11fresnelvn_tfresnelvn_t __REFLECTANCE_OUT, __VSR_CAMERA_REFLECTION.w, c[VSC_FRESNEL_PARAM], VSR_ILU_R1 __REFLECTANCE_OUT, __VSR_CAMERA_REFLECTION.w, c[VSC_FRESNEL_PARAM], VSR_ILU_R1

#endif#endif // #ifdef VS_TEX_ENV_FRESNELREFLECTANCE// #ifdef VS_TEX_ENV_FRESNELREFLECTANCE

#undef#undef __REFLECTANCE_OUT __REFLECTANCE_OUT

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

ピクセルシェーダ条件制御コードピクセルシェーダ条件制御コード

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//----------------------------------------------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------// "PSPIPE_STANDARD_DEF.h"// "PSPIPE_STANDARD_DEF.h"// // 標準的なピクセルシェーダパイプラインの共通宣言部標準的なピクセルシェーダパイプラインの共通宣言部////// // 処理制御フラグ処理制御フラグ// PS_DAYTIME : // PS_DAYTIME : 昼間レンダリングモード昼間レンダリングモード// PS_NIGHTTIME : // PS_NIGHTTIME : 夜間レンダリングモード夜間レンダリングモード////// PS_ADDITIVE_LIGHT : v1 // PS_ADDITIVE_LIGHT : v1 に追加光源の輝度が入っているに追加光源の輝度が入っている// // デフォルトでは デフォルトでは v0 v0 に全ての光源に全ての光源// PS_TEX_BASE : // PS_TEX_BASE : ベーステクスチャありベーステクスチャあり (( かならずセットされるかならずセットされる ))// PS_TEX_ENV_REFLECTANCE : // PS_TEX_ENV_REFLECTANCE : 反射率反射率 (v1.a etc.)(v1.a etc.) による環境マップによる環境マップ// PS_TEX_ENV_ADD : // PS_TEX_ENV_ADD : 加算系環境マップ加算系環境マップ// PS_TEX_ENV_GLOSS : // PS_TEX_ENV_GLOSS : 環境マップグロス有効環境マップグロス有効// PS_TEX_ENV_GLOSS_INV : // PS_TEX_ENV_GLOSS_INV : 環境マップグロス環境マップグロス (1-(1- 反射率反射率 )) 有効有効// PS_DISABLE_FOG : FOG // PS_DISABLE_FOG : FOG レジスタを元にするフォグブレンディングを行わないレジスタを元にするフォグブレンディングを行わない// // デフォルトでは デフォルトでは FOG FOG ブレンド有効ブレンド有効// PS_TEX_LIGHT_PRIMARY : // PS_TEX_LIGHT_PRIMARY : プライマリライトに対するライトマップ有効プライマリライトに対するライトマップ有効 (( ライトマップ系ライトマップ系 ))// PS_TEX_MODULATE_DIFFUSE : // PS_TEX_MODULATE_DIFFUSE : ディフューズ乗算有効ディフューズ乗算有効 (PS_TEX_LIGHT_PRIMARY (PS_TEX_LIGHT_PRIMARY とは排他的とは排他的 ))// PS_TEX_SHADOW_PRIMARY : // PS_TEX_SHADOW_PRIMARY : プライマリライトに対するシャドウマップ有効プライマリライトに対するシャドウマップ有効 (( シャドウマップ系シャドウマップ系 ))// // 夜間レンダリングモードで指定された場合は 夜間レンダリングモードで指定された場合は PS_TEX_ADDITIVE_LIGHT PS_TEX_ADDITIVE_LIGHT に置き換えられるに置き換えられる// PS_TEX_ADDITIVE_LIGHT : // PS_TEX_ADDITIVE_LIGHT : プライマリ/追加型の他にさらに追加されるライトプライマリ/追加型の他にさらに追加されるライト (( 通常ヘッドライト等通常ヘッドライト等 ))// PS_TEX_SHADOW_PRIMARY // PS_TEX_SHADOW_PRIMARY とは排他的とは排他的// PS_TEX_ENV_ADD_SHADOW : // PS_TEX_ENV_ADD_SHADOW : 加算系環境マップはプライマリライトに対するシャドウ/ライトマップの影響を受ける加算系環境マップはプライマリライトに対するシャドウ/ライトマップの影響を受ける// // 少なくとも 少なくとも PS_TEX_LIGHT_PRIMARY / PS_TEX_SHADOW_PRIMARY PS_TEX_LIGHT_PRIMARY / PS_TEX_SHADOW_PRIMARY のいずれかは有効のいずれかは有効// PS_TEX_OPACITY : // PS_TEX_OPACITY : ベースベース αα を不透明度として利用を不透明度として利用// PS_TEX_ILLUM : // PS_TEX_ILLUM : 自己照明マテリアル自己照明マテリアル (v0.a, t0.a, t1.a etc. (v0.a, t0.a, t1.a etc. によって自己照明されるによって自己照明される ))// // 環境マップ系とはグロス環境マップ系とはグロス (PS_TEX_ENV_GLOSS*)(PS_TEX_ENV_GLOSS*) の無いマテリアルのみ併用可能の無いマテリアルのみ併用可能 (\)(\)// // つまり つまり PS_TEX_ENV_GLOSS* PS_TEX_ENV_GLOSS* との併用は不可との併用は不可// PS_GLASS : // PS_GLASS : 半透明環境マップ半透明環境マップ ((ガラスガラス )) 専用モード専用モード// // 必ず環境マップ系と併用で自己照明は無効必ず環境マップ系と併用で自己照明は無効// PS_GLASS_TM : // PS_GLASS_TM : ガラスガラス (( 半透明環境マップ半透明環境マップ ))// // ただしシングルパスでトーンマップまで行う特殊ケースただしシングルパスでトーンマップまで行う特殊ケース// PS_GLASS* // PS_GLASS* 系は 系は PS_TEX_ENV_ADD PS_TEX_ENV_ADD とは併用できないとは併用できない

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

ピクセルシェーダ条件制御コードピクセルシェーダ条件制御コード(2)(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//----------------------------------------------//----------------------------------------------// // カラーセパレート入力制御カラーセパレート入力制御// VSPIPE_STANDARD.h// VSPIPE_STANDARD.h// #define LIT_OUTPUT_SEPARATE// #define LIT_OUTPUT_SEPARATE// // と対応していることと対応していること#define#define PS_ADDITIVE_LIGHT PS_ADDITIVE_LIGHT

#ifndef#ifndef PS_DAYTIME PS_DAYTIME#ifndef#ifndef PS_NIGHTTIME PS_NIGHTTIME

#define#define PS_DAYTIME PS_DAYTIME#endif#endif // #ifndef PS_NIGHTTIME// #ifndef PS_NIGHTTIME#endif#endif // #ifndef PS_DAYTIME// #ifndef PS_DAYTIME

#ifdef#ifdef PS_DAYTIME PS_DAYTIME// // 昼間でライトマップ/シャドウマップ系が有効の場合昼間でライトマップ/シャドウマップ系が有効の場合// // 加算環境マップにはライト/シャドウの影響を与える加算環境マップにはライト/シャドウの影響を与える#ifdef#ifdef PS_TEX_LIGHT_PRIMARY PS_TEX_LIGHT_PRIMARY

#ifndef#ifndef PS_TEX_ENV_ADD_SHADOW PS_TEX_ENV_ADD_SHADOW#define#define PS_TEX_ENV_ADD_SHADOW PS_TEX_ENV_ADD_SHADOW#endif#endif

#endif#endif // // #ifdef PS_TEX_LIGHT_PRIMARY#ifdef PS_TEX_LIGHT_PRIMARY

#ifdef#ifdef PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARY#ifndef#ifndef PS_TEX_ENV_ADD_SHADOW PS_TEX_ENV_ADD_SHADOW#define#define PS_TEX_ENV_ADD_SHADOW PS_TEX_ENV_ADD_SHADOW#endif#endif

#endif#endif // // #ifdef PS_TEX_SHADOW_PRIMAR#ifdef PS_TEX_SHADOW_PRIMARYY

#else#else // #ifdef PS_DAYTIME// #ifdef PS_DAYTIME// // 夜間モード夜間モード#ifndef#ifndef PS_NIGHTTIME PS_NIGHTTIME

#define#define PS_NIGHTTIME PS_NIGHTTIME#endif#endif // // #ifndef PS_NIGHTTIME#ifndef PS_NIGHTTIME

// // 夜間モードのシャドウマッピング設定夜間モードのシャドウマッピング設定#ifdef#ifdef PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARY

#define#define PS_TEX_ADDITIVE_LIGHT PS_TEX_ADDITIVE_LIGHT#undef#undef PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARY

#endif#endif // #ifdef PS_TEX_SHADOW_PRIMARY// #ifdef PS_TEX_SHADOW_PRIMARY

#endif#endif // #ifdef PS_DAYTIME// #ifdef PS_DAYTIME

// // ベーステクスチャは必ず存在ベーステクスチャは必ず存在#ifndef#ifndef PS_TEX_BASE PS_TEX_BASE

#define#define PS_TEX_BASE PS_TEX_BASE#endif#endif // #ifndef PS_TEX_BASE// #ifndef PS_TEX_BASE

// // ガラス系マテリアルかガラス系マテリアルか#ifdef#ifdef PS_GLASS_TM PS_GLASS_TM

#define#define PS_GLASS PS_GLASS#endif#endif // #ifdef PS_GLASS_TM// #ifdef PS_GLASS_TM

// // グロス系のいずれかが有効グロス系のいずれかが有効#ifdef#ifdef PS_TEX_ENV_GLOSS_INV PS_TEX_ENV_GLOSS_INV

#define#define PS_TEX_ENV_GLOSS PS_TEX_ENV_GLOSS#endif#endif // #ifdef PS_TEX_ENV_GLOSS_INV// #ifdef PS_TEX_ENV_GLOSS_INV

// // 環境マップありか否か環境マップありか否か#ifdef#ifdef PS_TEX_ENV_REFLECTANCE PS_TEX_ENV_REFLECTANCE

#ifndef#ifndef PS_TEX_ENV PS_TEX_ENV#define#define PS_TEX_ENV PS_TEX_ENV#endif#endif // #ifndef PS_TEX_ENV// #ifndef PS_TEX_ENV

#endif#endif // #ifdef PS_TEX_ENV_REFLECTANCE// #ifdef PS_TEX_ENV_REFLECTANCE

#ifdef#ifdef PS_TEX_ENV_ADD PS_TEX_ENV_ADD#ifndef#ifndef PS_TEX_ENV PS_TEX_ENV#define#define PS_TEX_ENV PS_TEX_ENV#endif#endif // #ifndef PS_TEX_ENV// #ifndef PS_TEX_ENV

#endif#endif // #ifdef PS_TEX_ENV_ADD// #ifdef PS_TEX_ENV_ADD

#ifdef#ifdef PS_TEX_ENV_GLOSS PS_TEX_ENV_GLOSS#ifndef#ifndef PS_TEX_ENV PS_TEX_ENV#define#define PS_TEX_ENV PS_TEX_ENV#endif#endif // #ifndef PS_TEX_ENV// #ifndef PS_TEX_ENV

#endif#endif // #ifdef PS_TEX_ENV_GLOSS// #ifdef PS_TEX_ENV_GLOSS

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

ピクセルシェーダ条件制御コードピクセルシェーダ条件制御コード(3)(3)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

// // フォグブレンディング有効かフォグブレンディング有効か#ifndef#ifndef PS_DISABLE_FOG PS_DISABLE_FOG

#define#define PS_FOG PS_FOG // // フォグブレンディング有効フォグブレンディング有効#endif#endif // PS_DISABLE_FOG// PS_DISABLE_FOG

// // 加算系環境マップが影響を受けるライティングの結果レジスタ加算系環境マップが影響を受けるライティングの結果レジスタ#ifdef#ifdef PS_TEX_ENV_ADD_SHADOW PS_TEX_ENV_ADD_SHADOW

#ifdef#ifdef PS_TEX_LIGHT_PRIMARY PS_TEX_LIGHT_PRIMARY // t2 // t2 にライトマップが有効な場合にライトマップが有効な場合#define#define PSR_ENVSHADOW PSR_ENVSHADOW t2t2

#else#else // #ifdef PS_TEX_LIGHT_PRIMARY// #ifdef PS_TEX_LIGHT_PRIMARY // t2 // t2 がライトマップではなく がライトマップではなく t3 t3 がシャドウマップの場合がシャドウマップの場合#define#define PSR_ENVSHADOW PSR_ENVSHADOW t3t3

#endif#endif // #ifdef PS_TEX_LIGHT_PRIMARY// #ifdef PS_TEX_LIGHT_PRIMARY

#endif#endif // #ifdef PS_TEX_ENV_ADD_SHADOW// #ifdef PS_TEX_ENV_ADD_SHADOW

// // ベーステクスチャを一切持たないタイプベーステクスチャを一切持たないタイプ (t0/t2/t3 (t0/t2/t3 全て無効全て無効 ))#ifndef#ifndef PS_TEX_BASE PS_TEX_BASE#ifndef#ifndef PS_TEX_LIGHT_PRIMARY PS_TEX_LIGHT_PRIMARY#ifndef#ifndef PS_TEX_MODULATE_DIFFUSE PS_TEX_MODULATE_DIFFUSE#ifndef#ifndef PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARY#ifndef#ifndef PS_TEX_ADDITIVE_LIGHT PS_TEX_ADDITIVE_LIGHT

#define#define PS_CND_TEX_DISABLE PS_CND_TEX_DISABLE#endif#endif // #ifndef PS_TEX_ADDITIVE_LIGHT// #ifndef PS_TEX_ADDITIVE_LIGHT#endif#endif // #ifndef PS_TEX_SHADOW_PRIMARY// #ifndef PS_TEX_SHADOW_PRIMARY#endif#endif // #ifndef PS_TEX_MODULATE_DIFFUSE// #ifndef PS_TEX_MODULATE_DIFFUSE#endif#endif // #ifndef PS_TEX_LIGHT_PRIMARY// #ifndef PS_TEX_LIGHT_PRIMARY#endif#endif // #ifndef PS_TEX_BASE// #ifndef PS_TEX_BASE

// xmma // xmma ベーステクスチャマップの条件フラグベーステクスチャマップの条件フラグ#ifndef#ifndef PS_ADDITIVE_LIGHT PS_ADDITIVE_LIGHT#ifndef#ifndef PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARY#ifndef#ifndef PS_TEX_LIGHT_PRIMARY PS_TEX_LIGHT_PRIMARY

#define#define PS_CND_USE_XMMA PS_CND_USE_XMMA#endif#endif // #ifndef PS_TEX_LIGHT_PRIMARY// #ifndef PS_TEX_LIGHT_PRIMARY#endif#endif // #ifndef PS_TEX_SHADOW_PRIMARY// #ifndef PS_TEX_SHADOW_PRIMARY#endif#endif // #ifndef PS_ADDITIVE_LIGHT// #ifndef PS_ADDITIVE_LIGHT

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

ピクセルシェーダ条件制御コードピクセルシェーダ条件制御コード(4)(4)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//---------------------------------------------------------------------------//---------------------------------------------------------------------------// // 定数宣言定数宣言#define#define PSC_1d3_0p25 PSC_1d3_0p25 c7c7#define#define PSC_1d3 PSC_1d3 PSC_1d3_0p25.rgbPSC_1d3_0p25.rgb#define#define PSC_0p25 PSC_0p25 PSC_1d3_0p25.aPSC_1d3_0p25.adef def c7, 0.333333f, 0.333333f, 0.333333f, 0.25fc7, 0.333333f, 0.333333f, 0.333333f, 0.25f

//---------------------------------------------------------------------------//---------------------------------------------------------------------------// // テクスチャ宣言テクスチャ宣言#ifdef#ifdef PS_TEX_BASE PS_TEX_BASE

textex t0 t0 // // ベーステクスチャベーステクスチャ#define#define PS_ENABLE_BASETEX PS_ENABLE_BASETEX

#endif#endif // #ifdef PS_TEX_BASE// #ifdef PS_TEX_BASE

#ifdef#ifdef PS_TEX_ENV PS_TEX_ENVtextex t1 t1 // // 環境マップ系環境マップ系

#endif#endif // #ifdef PS_TEX_ENV// #ifdef PS_TEX_ENV

#ifdef#ifdef PS_TEX_LIGHT_PRIMARY PS_TEX_LIGHT_PRIMARYtextex t2 t2 // // プライマリライトに対するライトマッププライマリライトに対するライトマップ

#endif#endif // #ifdef PS_TEX_LIGHT_PRIMARY// #ifdef PS_TEX_LIGHT_PRIMARY

#ifdef#ifdef PS_TEX_MODULATE_DIFFUSE PS_TEX_MODULATE_DIFFUSEtextex t2 t2 // // マテリアルディフューズに対するモデュレーションマテリアルディフューズに対するモデュレーション

#endif#endif // #ifdef PS_TEX_MODULATE_DIFFUSE// #ifdef PS_TEX_MODULATE_DIFFUSE

#ifdef#ifdef PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARYtextex t3 t3 // // プライマリライトに対するシャドウマッププライマリライトに対するシャドウマップ

#endif#endif // #ifdef PS_TEX_SHADOW_PRIMARY// #ifdef PS_TEX_SHADOW_PRIMARY#ifdef#ifdef PS_TEX_ADDITIVE_LIGHT PS_TEX_ADDITIVE_LIGHT

textex t3 t3 // // 追加型のテクスチャライトマップ追加型のテクスチャライトマップ#endif#endif // #ifdef PS_TEX_ADDITIVE_LIGHT// #ifdef PS_TEX_ADDITIVE_LIGHT

//-----------------------------------------//-----------------------------------------// __LIGHTMAP // __LIGHTMAP はライトマップ/シャドウマップ系の乗算結果となるはライトマップ/シャドウマップ系の乗算結果となる// // ライト/シャドウマップが全て無効の場合は ライト/シャドウマップが全て無効の場合は __LIGHTMAP __LIGHTMAP は未定義となるは未定義となる#ifdef#ifdef PS_TEX_LIGHT_PRIMARY PS_TEX_LIGHT_PRIMARY

#define#define __LIGHTMAP __LIGHTMAP t2t2 // // ライトマップ有効時ライトマップ有効時#else#else // #ifdef PS_TEX_LIGHT_PRIMARY// #ifdef PS_TEX_LIGHT_PRIMARY

#ifdef#ifdef PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARY#define#define __LIGHTMAP __LIGHTMAP t3t3 // // ライトマップ無効でシャドウマップのみ有効の場合ライトマップ無効でシャドウマップのみ有効の場合#endif#endif // #ifdef PS_TEX_SHADOW_PRIMARY// #ifdef PS_TEX_SHADOW_PRIMARY

#endif#endif // #ifdef PS_TEX_LIGHT_PRIMARY// #ifdef PS_TEX_LIGHT_PRIMARY

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

ピクセルシェーダコードピクセルシェーダコード

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//----------------------------------------------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------// "PSPIPE_STANDARD.h"// "PSPIPE_STANDARD.h"// // 標準的なピクセルシェーダパイプラインの共通コード標準的なピクセルシェーダパイプラインの共通コード

// // 基本的なレジスタ割当基本的なレジスタ割当// t0.rgb : // t0.rgb : ベーステクスチャベーステクスチャ// t1.rgb : // t1.rgb : 環境マップテクスチャ環境マップテクスチャ// t2.rgb : // t2.rgb : 乗算乗算 (( ライトマップ/マテリアルモデュレーションライトマップ/マテリアルモデュレーション ))// v0.rgb : // v0.rgb : プライマリライティング結果プライマリライティング結果// v0.a : // v0.a : 自己照明マテリアルの輝度情報自己照明マテリアルの輝度情報// v1.rgb : // v1.rgb : 追加ライティング結果追加ライティング結果// v1.a : // v1.a : 反射率/鏡面反射強度反射率/鏡面反射強度// c[PSC_ALPHA].a : // c[PSC_ALPHA].a : 不透明度不透明度 αα// c[PSC_ILLUM].rgb : // c[PSC_ILLUM].rgb : 自己照明カラー自己照明カラー

//-----------------------------------------------------//-----------------------------------------------------// // ベーステクスチャ/環境マップ乗算処理ベーステクスチャ/環境マップ乗算処理#include#include "PS_SUBPROC\PS_STD_TEX_BASE_M.h" "PS_SUBPROC\PS_STD_TEX_BASE_M.h"

// r0.rgb : // r0.rgb : ベーステクスチャ/ライティング結果ベーステクスチャ/ライティング結果// v0.rgb : // v0.rgb : プライマリライティング結果プライマリライティング結果 (( シャドウ含むシャドウ含む ))// t0.a : // t0.a : 自己照明マテリアルの輝度情報 自己照明マテリアルの輝度情報 * 4* 4

//-----------------------------------------------------//-----------------------------------------------------// // 環境マップ合成処理環境マップ合成処理#ifdef#ifdef PS_TEX_ENV PS_TEX_ENV

#include#include "PS_SUBPROC\PS_STD_TEX_ENV.h" "PS_SUBPROC\PS_STD_TEX_ENV.h"#endif#endif // #ifdef PS_TEX_ENV// #ifdef PS_TEX_ENV

//-----------------------------------------------------//-----------------------------------------------------// // 自己照明合成処理自己照明合成処理#ifdef#ifdef PS_TEX_ILLUM PS_TEX_ILLUM

// // 自己照明ベーステクスチャ輝度で照明自己照明ベーステクスチャ輝度で照明 (t0.a (t0.a は は v0.a * t0.a * 4 v0.a * t0.a * 4 になっているになっている ))lrplrp r0.rgb, t0.a, t0.rgb, r0.rgb r0.rgb, t0.a, t0.rgb, r0.rgb

#ifdef#ifdef PS_TEX_ENV_ILLUM PS_TEX_ENV_ILLUM// // 環境マップありの自己照明環境マップありの自己照明 (( グロスなしのみグロスなしのみ ))+lrp+lrp r0.a, t0.a, v0.a, r0.a r0.a, t0.a, v0.a, r0.a

#else#else // #ifdef PS_TEX_ENV_ILLUM// #ifdef PS_TEX_ENV_ILLUM// // 環境マップなしの自己照明環境マップなしの自己照明 (( そのまま出力そのまま出力 ))+mov+mov r0.a, v0.a r0.a, v0.a

#endif#endif // #ifdef PS_TEX_ENV_ILLUM// #ifdef PS_TEX_ENV_ILLUM

#endif#endif // #ifdef PS_TEX_ILLUM// #ifdef PS_TEX_ILLUM

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

ピクセルシェーダコード(2)ピクセルシェーダコード(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//-----------------------------------------------------//-----------------------------------------------------// // フォグブレンディング/スペキュラー加算等フォグブレンディング/スペキュラー加算等#ifndef#ifndef PS_TEX_ILLUM PS_TEX_ILLUM#ifdef#ifdef PS_TEX_ENV PS_TEX_ENV#ifndef#ifndef PS_GLASS_TM PS_GLASS_TM

#define#define PS_TEX_ENV_ILLUM_NONE PS_TEX_ENV_ILLUM_NONE // // 環境マップありで自己照明なしでグラスでもなし環境マップありで自己照明なしでグラスでもなし#endif#endif // #ifndef PS_GLASS_TM// #ifndef PS_GLASS_TM#endif#endif // #ifdef PS_TEX_ENV// #ifdef PS_TEX_ENV#endif#endif // #ifndef PS_TEX_ILLUM// #ifndef PS_TEX_ILLUM

// xfc // xfc 処理種別処理種別#ifndef#ifndef PS_TEX_ENV_ILLUM_NONE PS_TEX_ENV_ILLUM_NONE#ifndef#ifndef PS_GLASS_TM PS_GLASS_TM

#define#define PS_XFC_DEFAULT PS_XFC_DEFAULT // // 標準的な 標準的な xfcxfc#endif#endif // #ifndef PS_GLASS_TM// #ifndef PS_GLASS_TM#endif#endif // #ifndef PS_TEX_ENV_ILLUM_NONE// #ifndef PS_TEX_ENV_ILLUM_NONE

// // 最も標準的な処理最も標準的な処理#ifdef#ifdef PS_XFC_DEFAULT PS_XFC_DEFAULT

xfcxfc FOG.a, r0, FOG.rgb, PROD, r0.rgb, r0.a, r0.a FOG.a, r0, FOG.rgb, PROD, r0.rgb, r0.a, r0.a#endif#endif // #ifdef PS_XFC_DEFAULT// #ifdef PS_XFC_DEFAULT

#ifdef#ifdef PS_TEX_ENV_ILLUM_NONE PS_TEX_ENV_ILLUM_NONE// // 環境マップありで自己照明無しの場合はさらに輝度を調整環境マップありで自己照明無しの場合はさらに輝度を調整xfcxfc FOG.a, r0, FOG.rgb, PROD, t1.rgb, r0.a, r0.a FOG.a, r0, FOG.rgb, PROD, t1.rgb, r0.a, r0.a

#endif#endif // #ifdef PS_TEX_ENV_ILLUM_NONE// #ifdef PS_TEX_ENV_ILLUM_NONE

// // ガラスの ガラスの 1 1 パスパス ((もしくはガラス系全てのもしくはガラス系全ての )) 描画用シェーダでは描画用シェーダでは// // 最終的なトーンマップ処理に近い処理をこの段階で行う最終的なトーンマップ処理に近い処理をこの段階で行う (( ただし自己照明系なしの場合のみただし自己照明系なしの場合のみ ))#ifdef#ifdef PS_GLASS_TM PS_GLASS_TM

#ifndef#ifndef PS_TEX_ILLUM PS_TEX_ILLUM// // 自己照明無しのグラス自己照明無しのグラスmul_x4mul_x4 r1.a, v1.a, t1.a r1.a, v1.a, t1.axfcxfc FOG.a, r0, FOG.rgb, PROD, r0.rgb, r1.a, r0.a FOG.a, r0, FOG.rgb, PROD, r0.rgb, r1.a, r0.a

#else#else // #ifndef PS_TEX_ILLUM// #ifndef PS_TEX_ILLUM// // 自己照明ありのグラス自己照明ありのグラスxfcxfc FOG.a, r0, FOG.rgb, ZERO, ZERO, ZERO, r0.a FOG.a, r0, FOG.rgb, ZERO, ZERO, ZERO, r0.a

#endif#endif // #ifndef PS_TEX_ILLUM// #ifndef PS_TEX_ILLUM#endif#endif // #ifdef PS_GLASS_TM// #ifdef PS_GLASS_TM

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

ピクセルシェーダファンクションピクセルシェーダファンクションコードコード

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//----------------------------------------------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------// "PS_SUBPROC\PS_STD_TEX_ENV.h"// "PS_SUBPROC\PS_STD_TEX_ENV.h"// // 標準的なピクセルシェーダパイプラインの環境マップテクスチャ合成処理標準的なピクセルシェーダパイプラインの環境マップテクスチャ合成処理////// // 入力レジスタ入力レジスタ// r0.rgb : // r0.rgb : ディフューズ結果ディフューズ結果// r0.a : // r0.a : 半透明度半透明度// v0.a : // v0.a : ディフューズ輝度ディフューズ輝度// t1.rgb : // t1.rgb : 環境マップテクスチャ環境マップテクスチャ// t1.a : // t1.a : 環境マップ輝度環境マップ輝度// v0.rgb : // v0.rgb : プライマリライティング結果プライマリライティング結果// v1.a : // v1.a : 反射率/鏡面反射強度反射率/鏡面反射強度////// // 出力レジスタ出力レジスタ// r0.rgb : // r0.rgb : ライティング/環境マップ結果ライティング/環境マップ結果////// // 処理制御フラグ処理制御フラグ// PS_TEX_ENV_REFLECTANCE : // PS_TEX_ENV_REFLECTANCE : 反射率反射率 (v1.a etc.)(v1.a etc.) による環境マップによる環境マップ// PS_TEX_ENV_ADD : // PS_TEX_ENV_ADD : 加算系環境マップ加算系環境マップ (PS_TEX_ENV_REFLECTANCE (PS_TEX_ENV_REFLECTANCE とは排他的とは排他的 ))// PS_TEX_ENV : // PS_TEX_ENV : いずれかの環境マップ系有効いずれかの環境マップ系有効// PS_TEX_ENV_ADD_SHADOW : // PS_TEX_ENV_ADD_SHADOW : 加算系環境マップはプライマリライトに対するシャドウ/ライトマップの影響を受ける加算系環境マップはプライマリライトに対するシャドウ/ライトマップの影響を受ける// PSR_ENVSHADOW // PSR_ENVSHADOW にライト/シャドウ情報が入っているにライト/シャドウ情報が入っている// PS_GLASS : // PS_GLASS : 半透明環境マップ半透明環境マップ ((ガラスガラス )) 専用モード専用モード// // 必ず環境マップ系と併用で自己照明は無効必ず環境マップ系と併用で自己照明は無効// PS_GLASS_TM : // PS_GLASS_TM : ガラスガラス (( 半透明環境マップ半透明環境マップ ))// // ただしシングルパスでトーンマップまで行う特殊ケースただしシングルパスでトーンマップまで行う特殊ケース// PS_GLASS* // PS_GLASS* 系は 系は PS_TEX_ENV_ADD PS_TEX_ENV_ADD とは併用できないとは併用できない

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

ピクセルシェーダファンクションコーピクセルシェーダファンクションコード(2)ド(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

#ifdef#ifdef PS_GLASS PS_GLASS// // ガラス専用環境マップ処理ガラス専用環境マップ処理

#define#define __REFOUTRGB __REFOUTRGB r0.rgbr0.rgb // // 通常なら 通常なら r0.rgb r0.rgb へへ

// // 反射率による補間合成反射率による補間合成// v1.b = // v1.b = 環境マップの光源度が高い程反射率から 環境マップの光源度が高い程反射率から 1.0 1.0 へへlrplrp v1.rgb, t1.a, 1-ZERO, v1.a v1.rgb, t1.a, 1-ZERO, v1.a // // 環境マップの光源度が高い程反射率から 環境マップの光源度が高い程反射率から 1.0 1.0 へへ// r1.a = // r1.a = 不透明度が高い程 不透明度が高い程 1 1 から反射率へから反射率へ+lrp+lrp r1.a, r0.a, v1.a, 1-ZERO r1.a, r0.a, v1.a, 1-ZERO // // 不透明度が高い程 不透明度が高い程 1 1 から反射率へから反射率へ

// r0.rgb // r0.rgb 出力カラーはフレームバッファブレンディングの影響を考慮出力カラーはフレームバッファブレンディングの影響を考慮// // 不透明に近い程通常の反射率で反射不透明に近い程通常の反射率で反射// // 透明に近い程反射率を高くする透明に近い程反射率を高くする (( 反射の割合が強くなる反射の割合が強くなる ))lrplrp __REFOUTRGB, r1.a, t1, r0 __REFOUTRGB, r1.a, t1, r0// r0.a // r0.a ブレンディング用出力ブレンディング用出力 αα// // 不透明に近い程 不透明に近い程 1.0 1.0 に近づくに近づく// // 透明に近い程反射率透明に近い程反射率 (( ただし環境マップただし環境マップ αα 輝度が高い程 輝度が高い程 1)1) に近づくに近づく+lrp+lrp r0.a, r0.a, r0.a, v1.b r0.a, r0.a, r0.a, v1.b // v1.b: // v1.b: 反射率だが環境マップ反射率だが環境マップ ααが高い程 が高い程 1 1 になるように補正されているになるように補正されている

// // 最後に更に最後に更に// // 環境マップ輝度が高い程出力カラーを環境マップに近づける環境マップ輝度が高い程出力カラーを環境マップに近づけるlrplrp __REFOUTRGB, t1.a, t1, r0 __REFOUTRGB, t1.a, t1, r0

#ifdef#ifdef PS_TEX_ENV_ADD PS_TEX_ENV_ADD// // エラーエラー ((加算環境マップ系とは併用不可加算環境マップ系とは併用不可 ))

#endif#endif // #ifdef PS_TEX_ENV_ADD// #ifdef PS_TEX_ENV_ADD

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

ピクセルシェーダファンクションコーピクセルシェーダファンクションコード(3)ド(3)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

#else#else // #ifdef PS_GLASS// #ifdef PS_GLASS// // 通常の不透明の環境マップ処理通常の不透明の環境マップ処理

#ifdef#ifdef PS_TEX_ENV_REFLECTANCE PS_TEX_ENV_REFLECTANCE

// // 反射率によるカラー補間反射率によるカラー補間lrplrp r0.rgb, v1.a, t1, r0 r0.rgb, v1.a, t1, r0 // // カラー補間カラー補間

// // 輝度によって環境マップを強く:環境マップ輝度、グロス輝度によって環境マップを強く:環境マップ輝度、グロス αα、シャイニネスから、シャイニネスから+mul_x2+mul_x2 r1.a, PSC_SHININNESS, t1.a r1.a, PSC_SHININNESS, t1.a // // 環境マップ輝度 環境マップ輝度 * * シャイニネス シャイニネス * 2* 2

#ifdef#ifdef PS_TEX_ENV_GLOSS PS_TEX_ENV_GLOSS// // グロス有効時は、グロスを最優先に、確実に反射輝度を落とすグロス有効時は、グロスを最優先に、確実に反射輝度を落とす// // 反射率では既にグロス考慮されているが、反射率では既にグロス考慮されているが、// // 環境マップ輝度が高いとグロスが低くても高い反射になってしまうことを防ぐ環境マップ輝度が高いとグロスが低くても高い反射になってしまうことを防ぐmulmul r1.rgb, r1.a, __GLOSS r1.rgb, r1.a, __GLOSS // // グロスグロス

#else#else // #ifdef PS_TEX_ENV_GLOSS// #ifdef PS_TEX_ENV_GLOSS// // グロス無効時グロス無効時movmov r1.rgb, r1.a r1.rgb, r1.a // // グロスなしグロスなし

#endif#endif // #ifdef PS_TEX_ENV_GLOSS// #ifdef PS_TEX_ENV_GLOSS

+mul+mul r0.a, v1.a, t1.a r0.a, v1.a, t1.a // // 輝度 輝度 = = 反射率 反射率 * * 環境マップ輝度環境マップ輝度

// r1.rgb = clamp(// r1.rgb = clamp( 環境マップ輝度 環境マップ輝度 * * シャイニネス シャイニネス * 2) * * 2) * グロスグロスlrplrp r0.rgb, r1_sat.b, t1, r0 r0.rgb, r1_sat.b, t1, r0 // // 反射輝度特性が高い程環境マップカラーを強く反射輝度特性が高い程環境マップカラーを強く

+lrp+lrp r0.a, r1_sat.b, t1.a, r0.a r0.a, r1_sat.b, t1.a, r0.a // // 輝度 輝度 = = 反射率 反射率 * * 環境マップ輝度と環境マップ輝度と// // 環境マップ輝度をシャイニネスに従って補間環境マップ輝度をシャイニネスに従って補間

#endif#endif // #ifdef PS_TEX_ENV_REFLECTANCE// #ifdef PS_TEX_ENV_REFLECTANCE

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

ピクセルシェーダファンクションコーピクセルシェーダファンクションコード(4)ド(4)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

// // 通常の不透明の環境マップ処理通常の不透明の環境マップ処理#ifdef#ifdef PS_TEX_ENV_ADD PS_TEX_ENV_ADD

// // 加算合成加算合成

#ifdef#ifdef PS_TEX_ENV_ADD_SHADOW PS_TEX_ENV_ADD_SHADOW// // 内積でマップ用ライトマップの輝度計算内積でマップ用ライトマップの輝度計算// // ただし、反射の目立つ昼間のシャドウはただし、反射の目立つ昼間のシャドウは// // 元々白黒であるため、元々白黒であるため、 b b 要素だけを元にしても問題なし要素だけを元にしても問題なし

mulmul t1.rgb, t1, PSR_ENVSHADOW.rgb t1.rgb, t1, PSR_ENVSHADOW.rgb // PSR_ENVSHADOW = t2 or t3// PSR_ENVSHADOW = t2 or t3+xmma+xmma t1.a, PSR_ENVSHADOW.a, DISCARD.a, t1.a, PSR_ENVSHADOW.b, 1-ZERO, PSR_ENVSHADOW.b t1.a, PSR_ENVSHADOW.a, DISCARD.a, t1.a, PSR_ENVSHADOW.b, 1-ZERO, PSR_ENVSHADOW.b

#endif#endif // #ifdef PS_TEX_ENV_ADD_SHADOW// #ifdef PS_TEX_ENV_ADD_SHADOW

madmad r0.rgb, v1.a, t1, r0 r0.rgb, v1.a, t1, r0

+mul+mul r0.a, v1.a, t1.a r0.a, v1.a, t1.alrplrp r0.rgb, r0.a, t1, r0 r0.rgb, r0.a, t1, r0 // // 輝度が高い程さらに環境マップカラーを強く輝度が高い程さらに環境マップカラーを強く+mul_x4+mul_x4 r0.a, v1.a, t1.a r0.a, v1.a, t1.a

#endif#endif // #ifdef PS_TEX_ENV_ADD// #ifdef PS_TEX_ENV_ADD

#endif#endif // #ifdef PS_GLASS// #ifdef PS_GLASS

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

生成された頂点シェーダ生成された頂点シェーダ

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

VSPIPE_STANDARD VSPIPE_STANDARD パイプラインパイプライン

各ファンクションのフラグメントタイプ各ファンクションのフラグメントタイプVSFUNC_ANIMATION = VSFRG_ANM_NONEVSFUNC_ANIMATION = VSFRG_ANM_NONEVSFUNC_TRANSFORM = VSFRG_XFORM_WVPVSFUNC_TRANSFORM = VSFRG_XFORM_WVPVSFUNC_VERTEXCOLOR = VSFRG_VCOLOR_NONEVSFUNC_VERTEXCOLOR = VSFRG_VCOLOR_NONEVSFUNC_LIGHTING = VSFRG_LIT_D2VSFUNC_LIGHTING = VSFRG_LIT_D2VSFUNC_TEX_2ND = VSFRG_TEX_2ND_NONEVSFUNC_TEX_2ND = VSFRG_TEX_2ND_NONEVSFUNC_TEX_SHADOWMAP = VSFRG_TEX_SHADOW_NONEVSFUNC_TEX_SHADOWMAP = VSFRG_TEX_SHADOW_NONEVSFUNC_TEX_ENVMAP = VSFRG_TEX_ENV_NONEVSFUNC_TEX_ENVMAP = VSFRG_TEX_ENV_NONEVSFUNC_OUTD0ALPHA = VSFRG_OD0A_DIFFUSEALPHAVSFUNC_OUTD0ALPHA = VSFRG_OD0A_DIFFUSEALPHA

以上の組み合わせで生成されるコード以上の組み合わせで生成されるコード

//-----------------------------------------------------//-----------------------------------------------------xvs.xvs.1.11.1#define#define SCREENSPACE SCREENSPACE#include#include "..\..\VShaderDef\VShaderMacros.h" "..\..\VShaderDef\VShaderMacros.h"

#define#define LIT_NUM_ADDITIVE_LIGHTS_1 LIT_NUM_ADDITIVE_LIGHTS_1

#include#include "..\VShaderFragment\VSPIPE_STANDARD.h" "..\VShaderFragment\VSPIPE_STANDARD.h"

VSPIPE_STANDARD VSPIPE_STANDARD パイプラインパイプライン

各ファンクションのフラグメントタイプ各ファンクションのフラグメントタイプVSFUNC_ANIMATION = VSFUNC_ANIMATION = VSFRG_ANM_SKIN_WGT4_PVSFRG_ANM_SKIN_WGT4_PVSFUNC_TRANSFORM = VSFUNC_TRANSFORM = VSFRG_XFORM_WVPVSFRG_XFORM_WVPVSFUNC_VERTEXCOLOR = VSFUNC_VERTEXCOLOR = VSFRG_VCOLOR_NONEVSFRG_VCOLOR_NONEVSFUNC_LIGHTING = VSFUNC_LIGHTING = VSFRG_LIT_D2_P2VSFRG_LIT_D2_P2VSFUNC_TEX_2ND = VSFUNC_TEX_2ND = VSFRG_TEX_2ND_M42_UVVSFRG_TEX_2ND_M42_UVVSFUNC_TEX_SHADOWMAP = VSFUNC_TEX_SHADOWMAP = VSFRG_TEX_SHADOW_M44_UVWQVSFRG_TEX_SHADOW_M44_UVWQVSFUNC_TEX_ENVMAP = VSFUNC_TEX_ENVMAP = VSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCALVSFRG_TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCALVSFUNC_OUTD0ALPHA = VSFRG_OD0A_DIFFUSEALPHAVSFUNC_OUTD0ALPHA = VSFRG_OD0A_DIFFUSEALPHA

以上の組み合わせで生成されるコード以上の組み合わせで生成されるコード

//-----------------------------------------------------//-----------------------------------------------------xvs.xvs.1.11.1#define#define SCREENSPACE SCREENSPACE#include#include "..\..\VShaderDef\VShaderMacros.h" "..\..\VShaderDef\VShaderMacros.h"

#define#define ANM_SKIN_NUM_WEIGHTS_4 ANM_SKIN_NUM_WEIGHTS_4#define#define LIT_NUM_ADDITIVE_LIGHTS_3 LIT_NUM_ADDITIVE_LIGHTS_3#define#define LIT_ADDITIVE_2_POINT LIT_ADDITIVE_2_POINT#define#define LIT_ADDITIVE_3_POINT LIT_ADDITIVE_3_POINT#define#define VS_TEX_2ND_M42_UV VS_TEX_2ND_M42_UV#define#define VS_TEX_SHADOW_M44_UVWQ VS_TEX_SHADOW_M44_UVWQ#define#define VS_TEX_ENV_CUBE VS_TEX_ENV_CUBE#define#define VS_MATRL_2TONE VS_MATRL_2TONE#define#define VS_MATRL_METALLIC VS_MATRL_METALLIC#define#define XFORM_ADJUST_ENV_REF XFORM_ADJUST_ENV_REF

#include#include "..\VShaderFragment\VSPIPE_STANDARD.h" "..\VShaderFragment\VSPIPE_STANDARD.h"

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

プリプロセス後頂点シェーダプリプロセス後頂点シェーダ

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

//-----------------------------------------------------//----------------------------------------------------- xvs.xvs.1.11.1

madmad r0.xyz, v0, c[-48].w, c[-48].xyz r0.xyz, v0, c[-48].w, c[-48].xyzdphdph oPos.x, r0 oPos.x, r0 , c[-84], c[-84]dphdph oPos.y, r0 oPos.y, r0 , c[-83], c[-83]dphdph oPos.z, r0 oPos.z, r0 , c[-82], c[-82]dphdph oPos.w, r0 oPos.w, r0 , c[-81], c[-81]mulmul oPos.xyz, r12, c-38 oPos.xyz, r12, c-38+rcc+rcc r1.x, r12.w r1.x, r12.wmadmad oPos.xyz, r12, r1.x, c-37 oPos.xyz, r12, r1.x, c-37m3x2m3x2 r6, v4, c[-87] r6, v4, c[-87]madmad oPos.xy, c[-43].xy, r6.xy, r12.xy oPos.xy, c[-43].xy, r6.xy, r12.xymadmad oPos.z, c[-43].z, r1.x, r12.z oPos.z, c[-43].z, r1.x, r12.zdphdph r8.w, v4, c[-80] r8.w, v4, c[-80]dphdph r8.x, v4, c[-79] r8.x, v4, c[-79]maxmax r8.xw, r8.xw, c[-35].z r8.xw, r8.xw, c[-35].zmulmul r9.rgb, r8.w, c[-75].rgb r9.rgb, r8.w, c[-75].rgbmulmul oD0.rgb, r9.rgb, c[-62].rgb oD0.rgb, r9.rgb, c[-62].rgbmulmul r9.rgb, r8.x, c[-73].rgb r9.rgb, r8.x, c[-73].rgbdphdph r11.x, v4, c[-63] r11.x, v4, c[-63]addadd r9.rgb, c[-64].rgb, r9.rgb r9.rgb, c[-64].rgb, r9.rgbmadmad r9.rgb, r11.x, c[-65].rgb, r9.rgb r9.rgb, r11.x, c[-65].rgb, r9.rgbmulmul oD1.rgb, r9.rgb, c[-62].rgb oD1.rgb, r9.rgb, c[-62].rgbmadmad oT0.xy, v12, c[-47].w, c[-47].xyz oT0.xy, v12, c[-47].w, c[-47].xyzmovmov oFog.x, r12 oFog.x, r12 .w.w

// EOF// EOF

//-----------------------------------------------------//----------------------------------------------------- xvs.xvs.1.11.1

madmad r8.xyz, v0, c[-48].w, c[-48].xyz r8.xyz, v0, c[-48].w, c[-48].xyzmulmul r1, v10, c[-34].z r1, v10, c[-34].zmovmov a0.x, r1.x a0.x, r1.xdphdph r9.x, r8, c[a0.x + 0] r9.x, r8, c[a0.x + 0]dphdph r9.y, r8, c[a0.x +1] r9.y, r8, c[a0.x +1]dphdph r9.z, r8, c[a0.x +2] r9.z, r8, c[a0.x +2]m3x3m3x3 r10, v4, c[a0.x + 0] r10, v4, c[a0.x + 0]mulmul r0.xyz, r9.xyz, v11.x r0.xyz, r9.xyz, v11.xmulmul r2.xyz, r10.xyz, v11.x r2.xyz, r10.xyz, v11.xmovmov a0.x, r1.y a0.x, r1.ydphdph r9.x, r8, c[a0.x + 0] r9.x, r8, c[a0.x + 0]dphdph r9.y, r8, c[a0.x +1] r9.y, r8, c[a0.x +1]dphdph r9.z, r8, c[a0.x +2] r9.z, r8, c[a0.x +2]m3x3m3x3 r10, v4, c[a0.x + 0] r10, v4, c[a0.x + 0]madmad r0.xyz, r9.xyz, v11.y, r0.xyz r0.xyz, r9.xyz, v11.y, r0.xyzmadmad r2.xyz, r10.xyz, v11.y, r2.xyz r2.xyz, r10.xyz, v11.y, r2.xyzmovmov a0.x, r1.z a0.x, r1.zdphdph r9.x, r8, c[a0.x + 0] r9.x, r8, c[a0.x + 0]dphdph r9.y, r8, c[a0.x +1] r9.y, r8, c[a0.x +1]dphdph r9.z, r8, c[a0.x +2] r9.z, r8, c[a0.x +2]m3x3m3x3 r10, v4, c[a0.x + 0] r10, v4, c[a0.x + 0]madmad r0.xyz, r9.xyz, v11.z, r0.xyz r0.xyz, r9.xyz, v11.z, r0.xyzmadmad r2.xyz, r10.xyz, v11.z, r2.xyz r2.xyz, r10.xyz, v11.z, r2.xyzmovmov a0.x, r1.w a0.x, r1.wdphdph r9.x, r8, c[a0.x + 0] r9.x, r8, c[a0.x + 0]dphdph r9.y, r8, c[a0.x +1] r9.y, r8, c[a0.x +1]dphdph r9.z, r8, c[a0.x +2] r9.z, r8, c[a0.x +2]m3x3m3x3 r10, v4, c[a0.x + 0] r10, v4, c[a0.x + 0]madmad r0.xyz, r9.xyz, v11.w, r0.xyz r0.xyz, r9.xyz, v11.w, r0.xyzmadmad r2.xyz, r10.xyz, v11.w, r2.xyz r2.xyz, r10.xyz, v11.w, r2.xyzdphdph oPos.x, r0, c[-84] oPos.x, r0, c[-84]dphdph oPos.y, r0, c[-83] oPos.y, r0, c[-83]dphdph oPos.z, r0, c[-82] oPos.z, r0, c[-82]dphdph oPos.w, r0, c[-81] oPos.w, r0, c[-81]

// // 次のページへ続く次のページへ続く

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

プリプロセス後頂点シェーダプリプロセス後頂点シェーダ(2)(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

dphdph r5.x, r0, c[-87] r5.x, r0, c[-87]dphdph r5.y, r0, c[-86] r5.y, r0, c[-86]dphdph r5.z, r0, c[-85] r5.z, r0, c[-85]m3x3m3x3 r6, r2, c[-87] r6, r2, c[-87]dp3dp3 r7.w, r5.xyz, r5.xyz r7.w, r5.xyz, r5.xyzrsqrsq r7.w, r7.w r7.w, r7.wmulmul r7.xyz, r5.xyz, r7.w r7.xyz, r5.xyz, r7.wdp3dp3 r4.w, r7, r6 r4.w, r7, r6mulmul r1.xyz, -c[-36].z, r6.xyz r1.xyz, -c[-36].z, r6.xyzmadmad r4.xyz, r1.xyz, r4.w, r7 r4.xyz, r1.xyz, r4.w, r7m3x3m3x3 r8, r0, c[-87] r8, r0, c[-87]madmad r4.xyz, r8.xyz, c[-42].z, r4.xyz r4.xyz, r8.xyz, c[-42].z, r4.xyzdp3dp3 r1.x, r4.xyz, r4.xyz r1.x, r4.xyz, r4.xyzrsqrsq r1.x, r1.x r1.x, r1.xmulmul r4.xyz, r4.xyz, r1.x r4.xyz, r4.xyz, r1.xmulmul oPos.xyz, r12, c-38 oPos.xyz, r12, c-38+rcc+rcc r1.x, r12.w r1.x, r12.wmadmad oPos.xyz, r12, r1.x, c-37 oPos.xyz, r12, r1.x, c-37madmad oPos.xy, c[-43].xy, r6.xy, r12.xy oPos.xy, c[-43].xy, r6.xy, r12.xymadmad oPos.z, c[-43].z, r1.x, r12.z oPos.z, c[-43].z, r1.x, r12.zmulmul r8.xyz, c[-93], r4.x r8.xyz, c[-93], r4.xmadmad r8.xyz, c[-92], r4.y, r8 r8.xyz, c[-92], r4.y, r8madmad oT1.xyz, c[-91], r4.z, r8 oT1.xyz, c[-91], r4.z, r8addadd r1.xy, r4.w, v0.w r1.xy, r4.w, v0.wmovmov r1.w, c[-60].w r1.w, c[-60].wlitlit r1, r1 r1, r1madmad oD1.a, r1.z, -c[-60].z, c[-60].x oD1.a, r1.z, -c[-60].z, c[-60].xmovmov r3, c[-62] r3, c[-62]mulmul r8.w, -r4.w, -r4.w r8.w, -r4.w, -r4.wmadmad r3.rgb, c[-61].rgb, r8.w, r3.rgb r3.rgb, c[-61].rgb, r8.w, r3.rgbdphdph r1.x, r6, c[-76] r1.x, r6, c[-76]dp3dp3 r1.y, r4, c[-76] r1.y, r4, c[-76]movmov r1.w, c[-59].w r1.w, c[-59].wlitlit r1, r1 r1, r1minmin r1.z, r1.z, r1.y r1.z, r1.z, r1.ymadmad r8.w, r1.z, c[-59].x, r1.y r8.w, r1.z, c[-59].x, r1.ydphdph r1.x, r6, c[-74] r1.x, r6, c[-74]dp3dp3 r1.y, r4, c[-74] r1.y, r4, c[-74]movmov r1.w, c[-59].w r1.w, c[-59].wlitlit r1, r1 r1, r1

madmad r8.x, r1.z, c[-59].y, r1.y r8.x, r1.z, c[-59].y, r1.ysubsub r1.xyz, c[-72].xyz, r5.xyz r1.xyz, c[-72].xyz, r5.xyzdp3dp3 r1.w, r1.xyz, r1.xyz r1.w, r1.xyz, r1.xyzrsqrsq r1.w, r1.w r1.w, r1.wmulmul r1.xyz, r1.xyz, r1.w r1.xyz, r1.xyz, r1.wdphdph r10.x, r6, r1.xyz r10.x, r6, r1.xyzdp3dp3 r10.y, r4, r1.xyz r10.y, r4, r1.xyzmovmov r10.w, c[-59].w r10.w, c[-59].wlitlit r10, r10 r10, r10madmad r8.y, r10.z, c[-59].y, r10.y r8.y, r10.z, c[-59].y, r10.ymulmul r8.y, r8.y, r1.w r8.y, r8.y, r1.wsubsub r1.xyz, c[-70].xyz, r5.xyz r1.xyz, c[-70].xyz, r5.xyzdp3dp3 r1.w, r1.xyz, r1.xyz r1.w, r1.xyz, r1.xyzrsqrsq r1.w, r1.w r1.w, r1.wmulmul r1.xyz, r1.xyz, r1.w r1.xyz, r1.xyz, r1.wdphdph r10.x, r6, r1.xyz r10.x, r6, r1.xyzdp3dp3 r10.y, r4, r1.xyz r10.y, r4, r1.xyzmovmov r10.w, c[-59].w r10.w, c[-59].wlitlit r10, r10 r10, r10madmad r8.z, r10.z, c[-59].y, r10.y r8.z, r10.z, c[-59].y, r10.ymulmul r8.z, r8.z, r1.w r8.z, r8.z, r1.wmulmul r9.rgb, r8.w, c[-75].rgb r9.rgb, r8.w, c[-75].rgbmulmul oD0.rgb, r9.rgb, r3.rgb oD0.rgb, r9.rgb, r3.rgbmulmul r9.rgb, r8.x, c[-73].rgb r9.rgb, r8.x, c[-73].rgbmadmad r9.rgb, r8.y, c[-71].rgb, r9.rgb r9.rgb, r8.y, c[-71].rgb, r9.rgbmadmad r9.rgb, r8.z, c[-69].rgb, r9.rgb r9.rgb, r8.z, c[-69].rgb, r9.rgbdphdph r11.x, r2, c[-63] r11.x, r2, c[-63]addadd r9.rgb, c[-64].rgb, r9.rgb r9.rgb, c[-64].rgb, r9.rgbmadmad r9.rgb, r11.x, c[-65].rgb, r9.rgb r9.rgb, r11.x, c[-65].rgb, r9.rgbmulmul oD1.rgb, r9.rgb, r3.rgb oD1.rgb, r9.rgb, r3.rgbmadmad oT0.xy, v12, c[-47].w, c[-47].xyz oT0.xy, v12, c[-47].w, c[-47].xyzdphdph oT2.x, r0, c[-58] oT2.x, r0, c[-58]dphdph oT2.y, r0, c[-57] oT2.y, r0, c[-57]dphdph oT3.x, r0, c[-54] oT3.x, r0, c[-54]dphdph oT3.y, r0, c[-53] oT3.y, r0, c[-53]dphdph oT3.z, r0, c[-52] oT3.z, r0, c[-52]movmov oFog.x, r12.w oFog.x, r12.w

// EOF// EOF

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

生成されたピクセルシェーダ生成されたピクセルシェーダ

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

PSPIPE_STANDARD PSPIPE_STANDARD パイプラインパイプライン

各ファンクションのフラグメントタイプ各ファンクションのフラグメントタイプPSFUNC_TEX_BASE = PSFRG_TEX_BASE_DIFFUSEPSFUNC_TEX_BASE = PSFRG_TEX_BASE_DIFFUSEPSFUNC_TEX_2ND = PSFRG_TEX_2ND_NONEPSFUNC_TEX_2ND = PSFRG_TEX_2ND_NONEPSFUNC_TEX_SHADOWMAP = PSFRG_TEX_SHADOWMAP_SHADOWMAPPSFUNC_TEX_SHADOWMAP = PSFRG_TEX_SHADOWMAP_SHADOWMAPPSFUNC_TEX_ENV = PSFRG_TEX_ENV_ADDPSFUNC_TEX_ENV = PSFRG_TEX_ENV_ADDPSFUNC_TEX_BASEALPHA = PSFRG_TEX_BA_GLOSSPSFUNC_TEX_BASEALPHA = PSFRG_TEX_BA_GLOSSPSFUNC_OPACITY = PSFRG_OPAC_NONEPSFUNC_OPACITY = PSFRG_OPAC_NONE

以上の組み合わせで生成されるコード以上の組み合わせで生成されるコード

//-----------------------------------------------------//-----------------------------------------------------xps.xps.1.11.1#include#include "..\..\PShaderDef\PShaderDefs.h" "..\..\PShaderDef\PShaderDefs.h"

#define#define PS_TEX_BASE PS_TEX_BASE#define#define PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARY#define#define PS_TEX_ENV_ADD PS_TEX_ENV_ADD#define#define PS_TEX_ENV_GLOSS PS_TEX_ENV_GLOSS#define#define PS_DAYTIME PS_DAYTIME#include#include "..\PShaderFragment\PSPIPE_STANDARD_DEF.h" "..\PShaderFragment\PSPIPE_STANDARD_DEF.h"

#include#include "..\PShaderFragment\PSPIPE_STANDARD.h“ "..\PShaderFragment\PSPIPE_STANDARD.h“

PSPIPE_STANDARD PSPIPE_STANDARD パイプラインパイプライン

各ファンクションのフラグメントタイプ各ファンクションのフラグメントタイプPSFUNC_TEX_BASE = PSFRG_TEX_BASE_DIFFUSEPSFUNC_TEX_BASE = PSFRG_TEX_BASE_DIFFUSEPSFUNC_TEX_2ND = PSFRG_TEX_2ND_LIGHTMAPPSFUNC_TEX_2ND = PSFRG_TEX_2ND_LIGHTMAPPSFUNC_TEX_SHADOWMAP = PSFRG_TEX_SHADOWMAP_SHADOWMAPPSFUNC_TEX_SHADOWMAP = PSFRG_TEX_SHADOWMAP_SHADOWMAPPSFUNC_TEX_ENV = PSFRG_TEX_ENV_REFLECTPSFUNC_TEX_ENV = PSFRG_TEX_ENV_REFLECTPSFUNC_TEX_BASEALPHA = PSFRG_TEX_BA_ILLUM_INVGLOSSPSFUNC_TEX_BASEALPHA = PSFRG_TEX_BA_ILLUM_INVGLOSSPSFUNC_OPACITY = PSFRG_OPAC_NONEPSFUNC_OPACITY = PSFRG_OPAC_NONE

以上の組み合わせで生成されるコード以上の組み合わせで生成されるコード

//-----------------------------------------------------//-----------------------------------------------------xps.xps.1.11.1#include#include "..\..\PShaderDef\PShaderDefs.h" "..\..\PShaderDef\PShaderDefs.h"

#define#define PS_TEX_BASE PS_TEX_BASE#define#define PS_TEX_LIGHT_PRIMARY PS_TEX_LIGHT_PRIMARY#define#define PS_TEX_SHADOW_PRIMARY PS_TEX_SHADOW_PRIMARY#define#define PS_TEX_ENV_REFLECTANCE PS_TEX_ENV_REFLECTANCE#define#define PS_TEX_ILLUM PS_TEX_ILLUM#define#define PS_TEX_ENV_GLOSS_INV PS_TEX_ENV_GLOSS_INV#define#define PS_DAYTIME PS_DAYTIME#include#include "..\PShaderFragment\PSPIPE_STANDARD_DEF.h" "..\PShaderFragment\PSPIPE_STANDARD_DEF.h"

#include#include "..\PShaderFragment\PSPIPE_STANDARD.h" "..\PShaderFragment\PSPIPE_STANDARD.h"

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

プリプロセス後ピクセルシェーダプリプロセス後ピクセルシェーダ

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

xps.xps.1.11.1

defdef c7, 0.333333f, 0.333333f, 0.333333f, 0.25f c7, 0.333333f, 0.333333f, 0.333333f, 0.25f

textex t0 t0textex t1 t1textex t3 t3

xmmaxmma v0.rgb, t1.rgb, DISCARD.rgb, v0, t3, t1, c[2] v0.rgb, t1.rgb, DISCARD.rgb, v0, t3, t1, c[2]xmmaxmma DISCARD.rgb, DISCARD.rgb, r0.rgb, t0, v0, t0, v1 DISCARD.rgb, DISCARD.rgb, r0.rgb, t0, v0, t0, v1+mul+mul v1.a, v1.a, t0.a v1.a, v1.a, t0.amulmul t1.rgb, t1, t3.rgb t1.rgb, t1, t3.rgb+xmma+xmma t1.a, t3.a, DISCARD.a, t1.a, t3.b, 1-ZERO, t3.b t1.a, t3.a, DISCARD.a, t1.a, t3.b, 1-ZERO, t3.bmadmad r0.rgb, v1.a, t1, r0 r0.rgb, v1.a, t1, r0+mul+mul r0.a, v1.a, t1.a r0.a, v1.a, t1.alrplrp r0.rgb, r0.a, t1, r0 r0.rgb, r0.a, t1, r0+mul_x4+mul_x4 r0.a, v1.a, t1.a r0.a, v1.a, t1.axfcxfc FOG.a, r0, FOG.rgb, PROD, t1.rgb, r0.a, r0.a FOG.a, r0, FOG.rgb, PROD, t1.rgb, r0.a, r0.a

xps.xps.1.11.1

defdef c7, 0.333333f, 0.333333f, 0.333333f, 0.25f c7, 0.333333f, 0.333333f, 0.333333f, 0.25f

textex t0 t0textex t1 t1textex t2 t2textex t3 t3

xmmaxmma t2.rgb, t1.rgb, DISCARD.rgb, t2, t3, t1, c[2] t2.rgb, t1.rgb, DISCARD.rgb, t2, t3, t1, c[2]mulmul v0.rgb, v0, t2 v0.rgb, v0, t2xmmaxmma DISCARD.rgb, DISCARD.rgb, r0.rgb, t0, v0, t0, v1 DISCARD.rgb, DISCARD.rgb, r0.rgb, t0, v0, t0, v1+xmma+xmma v0.a, v1.a, DISCARD.a, c[1].a, t0.a, v1.a, 1-t0.a v0.a, v1.a, DISCARD.a, c[1].a, t0.a, v1.a, 1-t0.amul_x2mul_x2 t0.rgb, t0, c[1].rgb t0.rgb, t0, c[1].rgb+mov_x4+mov_x4 t0.a, v0.a t0.a, v0.alrplrp r0.rgb, v1.a, t1, r0 r0.rgb, v1.a, t1, r0+mul_x2+mul_x2 r1.a, c[2].a, t1.a r1.a, c[2].a, t1.amulmul r1.rgb, r1.a, 1-t0.a r1.rgb, r1.a, 1-t0.a+mul+mul r0.a, v1.a, t1.a r0.a, v1.a, t1.alrplrp r0.rgb, r1_sat.b, t1, r0 r0.rgb, r1_sat.b, t1, r0+lrp+lrp r0.a, r1_sat.b, t1.a, r0.a r0.a, r1_sat.b, t1.a, r0.alrplrp r0.rgb, t0.a, t0.rgb, r0.rgb r0.rgb, t0.a, t0.rgb, r0.rgb+lrp+lrp r0.a, t0.a, v0.a, r0.a r0.a, t0.a, v0.a, r0.axfcxfc FOG.a, r0, FOG.rgb, PROD, r0.rgb, r0.a, r0.a FOG.a, r0, FOG.rgb, PROD, r0.rgb, r0.a, r0.a

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

シェーダフラグメントとサンプルシェーダフラグメントとサンプル画像画像

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

頂点シェーダフラグメントタイプ頂点シェーダフラグメントタイプANIMATION = ANIMATION = ANM_ANM_NONENONETRANSFORM = TRANSFORM = XFORM_WVPXFORM_WVPVERTEXCOLOR = VERTEXCOLOR = VCOLOR_NONEVCOLOR_NONELIGHTING = LIGHTING = LIT_D2_P2LIT_D2_P2TEX_2ND = TEX_2ND = TEX_2ND_M42_UVTEX_2ND_M42_UVTEX_SHADOWMAP = TEX_SHADOWMAP = TEX_SHADOW_M44_UVWQTEX_SHADOW_M44_UVWQTEX_ENVMAP = TEX_ENVMAP = TEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCALTEX_ENV_DYNANIC_MATRL_METALLIC2_APPROXLOCALOUTD0ALPHA = OD0A_DIFFUSEALPHAOUTD0ALPHA = OD0A_DIFFUSEALPHA

ピクセルシェーダフラグメントタイプピクセルシェーダフラグメントタイプTEX_BASE = TEX_BASE_DIFFUSETEX_BASE = TEX_BASE_DIFFUSETEX_2ND = TEX_2ND_LIGHTMAPTEX_2ND = TEX_2ND_LIGHTMAPTEX_SHADOWMAP = TEX_SHADOWMAP_SHADOWMAPTEX_SHADOWMAP = TEX_SHADOWMAP_SHADOWMAPTEX_ENV = TEX_ENV_REFLECTTEX_ENV = TEX_ENV_REFLECTTEX_BASEALPHA = TEX_BA_GLOSSTEX_BASEALPHA = TEX_BA_GLOSSOPACITY = OPAC_NONEOPACITY = OPAC_NONE

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

シェーダフラグメントとサンプル画像シェーダフラグメントとサンプル画像(2)(2)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

頂点シェーダフラグメントタイプ頂点シェーダフラグメントタイプANIMATION = ANIMATION = ANM_ANM_NONENONETRANSFORM = TRANSFORM = XFORM_WVPXFORM_WVPVERTEXCOLOR = VERTEXCOLOR = VCOLOR_NONEVCOLOR_NONELIGHTING = LIGHTING = LIT_D2_P2LIT_D2_P2TEX_2ND = TEX_2ND = TEX_2ND_M42_UVTEX_2ND_M42_UVTEX_SHADOWMAP = TEX_SHADOWMAP = TEX_SHADOW_M44_UVWQTEX_SHADOW_M44_UVWQTEX_ENVMAP = TEX_ENVMAP = TEX_ENV_DYNANIC_APPROXLOCALTEX_ENV_DYNANIC_APPROXLOCALOUTD0ALPHA = OD0A_DIFFUSEALPHAOUTD0ALPHA = OD0A_DIFFUSEALPHA

ピクセルシェーダフラグメントタイプピクセルシェーダフラグメントタイプTEX_BASE = TEX_BASE_DIFFUSETEX_BASE = TEX_BASE_DIFFUSETEX_2ND = TEX_2ND_LIGHTMAPTEX_2ND = TEX_2ND_LIGHTMAPTEX_SHADOWMAP = TEX_SHADOWMAP_SHADOWMAPTEX_SHADOWMAP = TEX_SHADOWMAP_SHADOWMAPTEX_ENV = TEX_ENV_REFLECTTEX_ENV = TEX_ENV_REFLECTTEX_BASEALPHA = TEX_BA_GLOSSTEX_BASEALPHA = TEX_BA_GLOSSOPACITY = OPAC_NONEOPACITY = OPAC_NONE

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

シェーダフラグメントとサンプル画像シェーダフラグメントとサンプル画像(3)(3)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

頂点シェーダフラグメントタイプ頂点シェーダフラグメントタイプANIMATION = ANIMATION = ANM_ANM_NONENONETRANSFORM = TRANSFORM = XFORM_WVPXFORM_WVPVERTEXCOLOR = VERTEXCOLOR = VCOLOR_NONEVCOLOR_NONELIGHTING = LIGHTING = LIT_D2_P2LIT_D2_P2TEX_2ND = TEX_2ND = TEX_2ND_M42_UVTEX_2ND_M42_UVTEX_SHADOWMAP = TEX_SHADOW_M44_UVWQ_SPOTLIGHTTEX_SHADOWMAP = TEX_SHADOW_M44_UVWQ_SPOTLIGHTTEX_ENVMAP = TEX_ENVMAP = TEX_ENV_DYNANICTEX_ENV_DYNANICOUTD0ALPHA = OD0A_DIFFUSEALPHAOUTD0ALPHA = OD0A_DIFFUSEALPHA

ピクセルシェーダフラグメントタイプピクセルシェーダフラグメントタイプTEX_BASE = TEX_BASE_DIFFUSETEX_BASE = TEX_BASE_DIFFUSETEX_2ND = TEX_2ND_LIGHTMAPTEX_2ND = TEX_2ND_LIGHTMAPTEX_SHADOWMAP = TEX_SHADOWMAP_SPOTLIGHTMAPTEX_SHADOWMAP = TEX_SHADOWMAP_SPOTLIGHTMAPTEX_ENV = TEX_ENV_REFLECTTEX_ENV = TEX_ENV_REFLECTTEX_BASEALPHA = TEX_BA_ILLUM_INVGLOSSTEX_BASEALPHA = TEX_BA_ILLUM_INVGLOSSOPACITY = OPAC_NONEOPACITY = OPAC_NONE

夜間レンダリング用パイプラインを使用夜間レンダリング用パイプラインを使用

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

シェーダフラグメントとサンプル画像シェーダフラグメントとサンプル画像(4)(4)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

頂点シェーダフラグメントタイプ頂点シェーダフラグメントタイプANIMATION = ANIMATION = ANM_ANM_NONENONETRANSFORM = TRANSFORM = XFORM_WVPXFORM_WVPVERTEXCOLOR = VERTEXCOLOR = VCOLOR_NONEVCOLOR_NONELIGHTING = LIGHTING = LIT_D2_P2LIT_D2_P2TEX_2ND = TEX_2ND = TEX_2ND_M42_UVTEX_2ND_M42_UVTEX_SHADOWMAP = TEX_SHADOW_M44_UVWQ_SPOTLIGHTTEX_SHADOWMAP = TEX_SHADOW_M44_UVWQ_SPOTLIGHTTEX_ENVMAP = TEX_ENVMAP = TEX_ENV_TEX_ENV_NONENONEOUTD0ALPHA = OD0A_DIFFUSEALPHAOUTD0ALPHA = OD0A_DIFFUSEALPHA

ピクセルシェーダフラグメントタイプピクセルシェーダフラグメントタイプTEX_BASE = TEX_BASE_DIFFUSETEX_BASE = TEX_BASE_DIFFUSETEX_2ND = TEX_2ND_LIGHTMAPTEX_2ND = TEX_2ND_LIGHTMAPTEX_SHADOWMAP = TEX_SHADOWMAP_SPOTLIGHTMAPTEX_SHADOWMAP = TEX_SHADOWMAP_SPOTLIGHTMAPTEX_ENV = TEX_ENV_NONETEX_ENV = TEX_ENV_NONETEX_BASEALPHA = TEX_BA_ILLUMTEX_BASEALPHA = TEX_BA_ILLUMOPACITY = OPAC_NONEOPACITY = OPAC_NONE

夜間レンダリング用パイプラインを使用夜間レンダリング用パイプラインを使用

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

シェーダフラグメントとサンプル画像シェーダフラグメントとサンプル画像(5)(5)

©2005 BUNKASHA PUBLISHING ©2005 BUNKASHA PUBLISHING CO.,LTD. CO.,LTD.

頂点シェーダフラグメントタイプ頂点シェーダフラグメントタイプANIMATION = ANM_NONEANIMATION = ANM_NONETRANSFORM = XFORM_WVPTRANSFORM = XFORM_WVPVERTEXCOLOR = VCOLOR_NONEVERTEXCOLOR = VCOLOR_NONELIGHTING = LIT_D4LIGHTING = LIT_D4TEX_2ND = TEX_2ND_NONETEX_2ND = TEX_2ND_NONETEX_SHADOWMAP = TEX_SHADOW_NONETEX_SHADOWMAP = TEX_SHADOW_NONETEX_ENVMAP = TEX_ENV_NONE_MATRL_CONSTANTCOLORTEX_ENVMAP = TEX_ENV_NONE_MATRL_CONSTANTCOLOROUTD0ALPHA = OD0A_DIFFUSEALPHAOUTD0ALPHA = OD0A_DIFFUSEALPHA

ピクセルシェーダフラグメントタイプピクセルシェーダフラグメントタイプTEX_BASE = TEX_BASE_DIFFUSETEX_BASE = TEX_BASE_DIFFUSETEX_2ND = TEX_2ND_NONETEX_2ND = TEX_2ND_NONETEX_SHADOWMAP = TEX_SHADOWMAP_NONETEX_SHADOWMAP = TEX_SHADOWMAP_NONETEX_ENV = TEX_ENV_NONETEX_ENV = TEX_ENV_NONETEX_BASEALPHA = TEX_BA_ILLUMTEX_BASEALPHA = TEX_BA_ILLUMOPACITY = OPAC_NONEOPACITY = OPAC_NONE

左下のサンプル画像み左下のサンプル画像み αα ブレンド適用の例ブレンド適用の例