3Dアプリケーションにて、レンズフレアを描いてみようと考えています
レンズフレアを描画するいくつかのステップの中で、
カメラの位置およびポリゴンの位置により、
レンズフレアを描画するかどうか?を判断するステップがあると思います
レンズフレアを画面に描画しなければならない条件は
1、太陽が画面内に存在する
2、太陽がどのポリゴンにも隠されていない
ということだと思います
1については、
太陽の位置*ビュー行列*プロジェクション行列*ビューポート行列
=画面上での太陽の座標
なので簡単に調べられるはずです。
問題は2で、
私が考えられる方法は、
カメラ位置→太陽の位置のレイと、
画面内のポリゴンおよびオブジェクトおよび、境界図形、との衝突判定を行う
というものがまず浮かぶのですが、
見た目にしか影響しないレンズフレアに、このような処理は割に合わないように感じます
(実行時計算量+コーディング作業量)
処理(実行時計算量+コーディング作業量)
が割りに合う範囲内で上記のものを実装する考え方をお伺いしたいです
よろしくおねがいします
環境は
Microsoft DirectX SDK (June 2010)
VisualStudio2010Express
言語はC++です
レンズフレアの有効化、無効化(directx)
Re:レンズフレアの有効化、無効化(directx)
#自分で実践したことはないのですが。
ゲームではどの方向を向いたときに見えるかをマップデータの一部として埋め込むのが一般的だと思います。
正確を期するなら影ではないところには光が当たっているわけですから、一回レンダリングしてステンシルバッファを作っておくと良いと思います。
ステンシルバッファをサンプリングすれば日向か日陰か分かるのであとは光源がある方向を元にフレアを配置すれば良いかと思います。
ゲームではどの方向を向いたときに見えるかをマップデータの一部として埋め込むのが一般的だと思います。
正確を期するなら影ではないところには光が当たっているわけですから、一回レンダリングしてステンシルバッファを作っておくと良いと思います。
ステンシルバッファをサンプリングすれば日向か日陰か分かるのであとは光源がある方向を元にフレアを配置すれば良いかと思います。
Re:レンズフレアの有効化、無効化(directx)
ステンシルバッファでマスク処理の方法は見つかったのですが、
ステンシルの値自体の参照は見つけられませんでした
仮に見つかったとしても、ロックしなければならないようです
そもそも参照するよりもステンシルテストのためのもので、
参照するためのものではないのかもしれません
今後アプリケーションごとに実装を考えていきたいと思います
とりあえず一応簡易的な形にはこれで閉めます
ステンシルの値自体の参照は見つけられませんでした
仮に見つかったとしても、ロックしなければならないようです
そもそも参照するよりもステンシルテストのためのもので、
参照するためのものではないのかもしれません
今後アプリケーションごとに実装を考えていきたいと思います
とりあえず一応簡易的な形にはこれで閉めます
Re:レンズフレアの有効化、無効化(directx)
ステンシルバッファというとマスクとして使うものでしたね。
使い方を間違えました。
専用のテクスチャにレンダリングしてそこからサンプリングするということです。
http://game.watch.impress.co.jp/docs/se ... 70531.html
↑のページの影生成のところのシャドウマップみたいな感じ。
というかそのまま日向判定に使えそうです。
使い方を間違えました。
専用のテクスチャにレンダリングしてそこからサンプリングするということです。
http://game.watch.impress.co.jp/docs/se ... 70531.html
↑のページの影生成のところのシャドウマップみたいな感じ。
というかそのまま日向判定に使えそうです。
Re:レンズフレアの有効化、無効化(directx)
ご回答ありがとうございます
シャドウマップ(もしくはカスケードシャドウマップあたり
などの影生成法を採用する場合は使ってみようかと思います。
シャドウマップ(もしくはカスケードシャドウマップあたり
などの影生成法を採用する場合は使ってみようかと思います。