DirectX11 でゲームを制作していまして、
ポストエフェクトのブラーを指定した位置から出したいです。
やりたいことは、
ワールド座標に配置したオブジェクトAのローカル座標を取得してきて、座標変換を行いそのオブジェクトAの位置からブラーをかけたいです。
現在はブラーをかけるところまで出来たのですが、
オブジェクトAの位置からブラーをかける方法が分かりません。
座標変換を行わないといけないと思うのですが、
ワールド座標からビュー座標に変換を行い、
ビュー座標からスクリーン座標に変換を行ったらいいでしょうか?
もう少しでできそうなのですが、アドバイスを頂けると嬉しいです。
座標変換した場所からブラーを出したい
Re: 座標変換した場所からブラーを出したい
3Dグラフィックス・マニアックス(34) ジオメトリシェーダ(5)~ジオメトリシェーダを活用した新表現(1)
3Dグラフィックス・マニアックス(34) ジオメトリシェーダ(6)~ジオメトリシェーダを活用した新表現(2)
3Dグラフィックス・マニアックス(34) ジオメトリシェーダ(7)~ジオメトリシェーダを活用した新表現(3)
ブラーの実装について書かれた解説記事(実装サンプルではない)です。
記事は古いですが、書いてある内容自体は古くないです。
実装サンプルは、記事に書かれたキーワード(ジオメトリシェーダとかベロシティマップとか)を参考に探してみてください。
3Dグラフィックス・マニアックス(34) ジオメトリシェーダ(6)~ジオメトリシェーダを活用した新表現(2)
3Dグラフィックス・マニアックス(34) ジオメトリシェーダ(7)~ジオメトリシェーダを活用した新表現(3)
ブラーの実装について書かれた解説記事(実装サンプルではない)です。
記事は古いですが、書いてある内容自体は古くないです。
実装サンプルは、記事に書かれたキーワード(ジオメトリシェーダとかベロシティマップとか)を参考に探してみてください。
Re: 座標変換した場所からブラーを出したい
回答ありがとうございます。
ジオメトリシェーダーとベロシティマップでのブラーのかけ方もやった事がないので
いずれやってみようと思います。
今やりたい処理としましてはモーションブラーではなくポストエフェクトでのブラーですので、
どうしても座標変換を使いやってみたいのです。
オブジェクトAのローカル座標をワールド座標に変換、
ワールド座標をビュー座標に変換、
ビュー座標をプロジェクション座標に変換、
プロジェクション座標をスクリーン座標に変換を行うとできるのかなと
勝手に思っているのですが、この考え方で間違っていないでしょうか?
最終的にはすべての座標変換を終えたオブジェクトAの位置の中心から、
ブラーをかけたいです。
ジオメトリシェーダーとベロシティマップでのブラーのかけ方もやった事がないので
いずれやってみようと思います。
今やりたい処理としましてはモーションブラーではなくポストエフェクトでのブラーですので、
どうしても座標変換を使いやってみたいのです。
オブジェクトAのローカル座標をワールド座標に変換、
ワールド座標をビュー座標に変換、
ビュー座標をプロジェクション座標に変換、
プロジェクション座標をスクリーン座標に変換を行うとできるのかなと
勝手に思っているのですが、この考え方で間違っていないでしょうか?
最終的にはすべての座標変換を終えたオブジェクトAの位置の中心から、
ブラーをかけたいです。
Re: 座標変換した場所からブラーを出したい
ああ、なるほど。
マンガの集中線みたいな感じで、ブラーの中心を任意のオブジェクトにしたいってことですかね。
でしたら、複雑なオブジェクトを対象にするのではなくて、ダミーの頂点一個を対象にするとしたほうが単純化できます。
で、オブジェクトAの中心とダミー頂点の座標を合わせれば、お望みの効果が得られるというわけです。
#ダミー頂点の座標をズラして応用もできる。
変換後のスクリーン座標は、シェーダーの中で取得できるので、わざわざ自前で計算する必要がありません。
せっかくメインCPUを使わず高速に計算してくれた結果を使わないのはもったいない。
#ベロシティマップとか作成する際にも使われている。
普通にレンダリングした、ポストエフェクトを掛ける前段で取得しておいて、ポストエフェクトの際にそれを利用すると良いのではないでしょうか。
どうしても座標変換を使いたいというのであれば、変換した結果をシェーダーにパラメータとして渡せば良いでしょうかね。
座標変換については、3Dグラフィックスの基本とか入門とあるような情報にあたると良いでしょう。
考え方は間違っていないと思いますが、変換行列の使い方を学びましょう。
マンガの集中線みたいな感じで、ブラーの中心を任意のオブジェクトにしたいってことですかね。
でしたら、複雑なオブジェクトを対象にするのではなくて、ダミーの頂点一個を対象にするとしたほうが単純化できます。
で、オブジェクトAの中心とダミー頂点の座標を合わせれば、お望みの効果が得られるというわけです。
#ダミー頂点の座標をズラして応用もできる。
変換後のスクリーン座標は、シェーダーの中で取得できるので、わざわざ自前で計算する必要がありません。
せっかくメインCPUを使わず高速に計算してくれた結果を使わないのはもったいない。
#ベロシティマップとか作成する際にも使われている。
普通にレンダリングした、ポストエフェクトを掛ける前段で取得しておいて、ポストエフェクトの際にそれを利用すると良いのではないでしょうか。
どうしても座標変換を使いたいというのであれば、変換した結果をシェーダーにパラメータとして渡せば良いでしょうかね。
座標変換については、3Dグラフィックスの基本とか入門とあるような情報にあたると良いでしょう。
考え方は間違っていないと思いますが、変換行列の使い方を学びましょう。
Re: 座標変換した場所からブラーを出したい
回答ありがとうございます!
そうです!ブラーの中心を任意のオブジェクトにしたいです。
ダミーの頂点一個を対象にするとは具体的にどういった事を行うのでしょうか?
今現在対象のオブジェクトの座標を取得する事は出来ています。
そこからの処理が今全く思いつかない状態です・・・
シェーダー側に対象のオブジェクトの座標を渡したりはしますでしょうか?
すみません、ご回答いただけると幸いです。
そうです!ブラーの中心を任意のオブジェクトにしたいです。
ダミーの頂点一個を対象にするとは具体的にどういった事を行うのでしょうか?
今現在対象のオブジェクトの座標を取得する事は出来ています。
そこからの処理が今全く思いつかない状態です・・・
シェーダー側に対象のオブジェクトの座標を渡したりはしますでしょうか?
すみません、ご回答いただけると幸いです。
Re: 座標変換した場所からブラーを出したい
#3を見直して気付いたのですが、vanitas710さんは、いまやろうとしていることと、モーションブラーは全く関係ないと思ってます?
#2で紹介した記事にある、いわゆるモーションブラーは、移動前後の頂点を補完する形でベロシティマップを生成しますが、vanitas710さんがいまやろうとしていることは、消失点から放射状に広がる形で補完する点が異なる以外は、ほぼモーションブラーと同じ処理になりますよ。
で、消失点の座標さえあれば、そこからの相対座標でブラーの強度を計算できるので、ダミーの頂点一個で足りるというふうに書きました。
#2で紹介した記事にある、いわゆるモーションブラーは、移動前後の頂点を補完する形でベロシティマップを生成しますが、vanitas710さんがいまやろうとしていることは、消失点から放射状に広がる形で補完する点が異なる以外は、ほぼモーションブラーと同じ処理になりますよ。
で、消失点の座標さえあれば、そこからの相対座標でブラーの強度を計算できるので、ダミーの頂点一個で足りるというふうに書きました。
Re: 座標変換した場所からブラーを出したい
vanitas710さんのご希望はあくまで、ポストエフェクトのみでってことなのですね。
となると、消失点のスクリーン座標を求めて、ピクセルシェーダーにパラメータとして渡すという形になりますかね。
わたしの提案はひとまず忘れてください。
ワールド座標からスクリーン座標を求める方法は、マウスで画面をクリックして3Dオブジェクトを選択する処理など頻繁に使われるので、『ワールド座標からスクリーン座標を求める方法』等で検索すればすぐに見付かるはずです。
シェーダーにパラメータを渡す方法も『シェーダーにパラメータを渡す方法』で検索すればすぐに見付かるはずです。
となると、消失点のスクリーン座標を求めて、ピクセルシェーダーにパラメータとして渡すという形になりますかね。
わたしの提案はひとまず忘れてください。
ワールド座標からスクリーン座標を求める方法は、マウスで画面をクリックして3Dオブジェクトを選択する処理など頻繁に使われるので、『ワールド座標からスクリーン座標を求める方法』等で検索すればすぐに見付かるはずです。
シェーダーにパラメータを渡す方法も『シェーダーにパラメータを渡す方法』で検索すればすぐに見付かるはずです。