トップページ > 記事閲覧
シェーダ3.0でライトを6個とフォグを使う方法
名前:オルゲ 日時: 2014/06/07 00:40

現在 FPSのホラーゲームを制作しています。 ここ最近のDxlibのアップデートでライトが6つまで使えるようになったり 3Dサウンドが簡単に使用可能になったということで、製作中のホラーFPSはモロに追い風をうけ Dxlibのアップデートには誠に感謝しております。 本日はライトを6個使用する方法とシェーダ3.0でフォグを使う方法について シェーダに関するプログラムは経験が少なく不明な点が多いので、質問させていただきます。 まずライトを6個使えるようにする方法ですが これに関しては大方見当がついています。 // C++ 側で設定する定数の定義 float4 cfAmbient_Emissive : register( c1 ) ;// マテリアルエミッシブカラー + マテリアルアンビエントカラー * グローバルアンビエントカラー float4 cfProjectionMatrix[ 4 ] : register( c2 ) ;// ビュー  → 射影行列 float4 cfViewMatrix[ 3 ] : register( c6 ) ;// ワールド → ビュー行列 float4 cfLocalWorldMatrix[ 3 ] : register( c94 ) ;// ローカル → ワールド行列 VS_CONST_MATERIAL cfMaterial : register( c11 ) ;// マテリアルパラメータ VS_CONST_LIGHT cfLight[ 2 ] : register( c14 ) ;// ディレクショナルライトとポイントライトのパラメータ ↑のような場所の cfLight[ 2 ] を cfLight[ 6 ] にして ↓のような場所に 追加したいタイプのライトを配列の数字だけ変えて追加していけば 6個まで使えるような気がしているのですが、これで大丈夫でしょうか。 個人的にはDirライトが1つ、スポットライトが2つ、ポイントライトが3つ使いたいので [0]にDir、[1]~[2]にSpot、[3]~[5]にポイントを当てはめればいい気がしています。 // ディレクショナルライトの処理 *****************************************************( 開始 ) // ライトの方向セット lLightDir = cfLight[ 0 ].Direction ; ~~~~~~~~~~~~~~~~~~~~略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ポイントライトの処理 *************************************************************( 開始 ) // ライト方向ベクトルの計算 lLightDir = normalize( lViewPosition.xyz - cfLight[ 1 ].Position.xyz ) ; ~~~~~~~~~~~~~~~~~~略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 次にかなり前にも同じような質問をしましたが結局やり方が分からず 放置していたシェーダ3.0でフォグを使う方法についてです。 サンプルプログラムには自前で計算してくださいと書いてありますが その書き方がわからず困っています。 取り敢えず闇雲にシェーダ3.0を使ったものにサンプルのフォグの式などをコピペしてみましたがフォグは使えませんでした。 やはりホラーゲームでは 懐中電灯となるスポットライトの綺麗なライティングと遠くが暗くなるフォグが非常に有効で なんとしても実装したいのでシェーダ3.0で自前でFogの計算をする方法を わかる方いたら是非ご教授をお願い致します。
メンテ

Page: 1 |

Re: シェーダ3.0でライトを6個とフォグを使う方法 ( No.1 )
名前:管理人 日時:2014/06/07 23:05

DXライブラリは Direct3D 9 で使用できる定数レジスタの数の関係で 頂点シェーダーでライティングを行う場合のライトの最大数は3つとなっています なので、6つまでライトを使用できるのは場合はピクセルシェーダーで ライティングをする場合のみとなっています 頂点シェーダーではライティングに関する処理を一切せず、ピクセルシェーダーで ライトの計算を全て行うサンプルをアップしましたので、よろしければご覧ください http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3DModelShaderBase.html#R4N4 あと、シェーダーの数を抑えるために複数の種類のライトを使用した場合は 必ず ディレクショナルライト・スポットライト・ポイントライトの順で 定数レジスタにパラメータが設定されますので注意してください 例えばDirライト1つ、スポットライト2つ、ポイントライト3つを 使用した場合、定数レジスタの cfLight では cfLight[ 0 ] が Dirライト cfLight[ 1 ], cfLight[ 2 ] がスポットライト cfLight[ 3 ], cfLight[ 4 ], cfLight[ 5 ] がポイントライトとなります シェーダ3.0でフォグ処理を行うサンプルもアップしましたので、よろしければご覧ください http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3DModelShaderBase.html#R1N4
メンテ
Re: シェーダ3.0でライトを6個とフォグを使う方法 ( No.2 )
名前:オルゲ(解決) 日時:2014/06/08 14:21

管理人さま 返信遅くなりました。 サンプルまで作っていただき本当にありがとうございます。 が、URLを踏んだとこ開けないと思っていたら IEで開いたら見ることができました。 Chromeだと更新されていない、、なんてことあるんですかね。 何はともあれ フォグとライト6つを入れたシェーダをゲームに入れてやってみます! ありがとうございました! 完成したらまたフリーゲームとしてうpします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存