ページ 11

ポイントライトによる影の生成について

Posted: 2014年2月13日(木) 14:49
by coc
以前ご紹介頂いたサンプルからポイントライトのピクセルシェーダーによる表示は完成しました。
またこちらのサンプル
http://homepage2.nifty.com/natupaji/DxL ... hadow.html
を参考に頂点シェーダーとピクセルシェーダーを書き換えて影の生成を行おうとしております。
一応ポイントライト表示自体の書き換えは上手くいったのですが、サンプルのプログラムの中で

コード:

// カメラの向きはライトの向き
	LightDirection = GetLightDirection() ;

	// カメラの位置と注視点はステージ全体が見渡せる位置
	LightTarget.x = 3620.0f ;
	LightTarget.y = 0.0f ;
	LightTarget.z = 3830.0f ;
	LightPosition = VAdd( LightTarget, VScale( LightDirection, -12400.0f ) ) ;
	SetCameraPositionAndTarget_UpVecY( LightPosition, LightTarget ) ;

	// 設定したカメラのビュー行列と射影行列を取得しておく
	LightCamera_ViewMatrix = GetCameraViewMatrix() ;
	LightCamera_ProjectionMatrix = GetCameraProjectionMatrix() ;
という箇所があり、ここで影となる深度画像をどの視点から映し出しているか計算しており、ここをポイントライトにするにはどうすれば良いのか悩んでおります。
カメラの位置(=ライトの位置)は自キャラ中心としたポイントライトにしたいので自キャラ中心で問題は無かったです。
しかし映し出す方向を進行方向にすると、
例えば正面を向いている時、真横に居るオブジェクトの影が進行方向に生成されてしまいます。(当たり前の話なんですが・・・)

そのため自キャラを中心として円形状に広がる様に方向を定めたいなと考えているのですが、どの様に書いたら宜しいのでしょうか?
(※深度記録画像を使ったシェーダープログラムはいじりましたが、深度記録画像へのシェーダープログラムはいじっておりません)

Re: ポイントライトによる影の生成について

Posted: 2014年2月13日(木) 16:32
by softya(ソフト屋)
ポイントライトの影は非常に負荷の高い処理になります。
どちらかと言うとPS3世代の処理と成るため高度です。
調べてみますが、DXLIBで実装できるかは今のところ分かりません。

【補足】
まだ調べてませんが、思いつきです。
180度ぐらいの画角で点光源の前と後ろのZバッファ情報を作って、これで影を生成、更にレンダリングすればソフトシャドウは出来そうです。
シュープなシャドウは無理です。

【点光源の追加】
「西川善司の3Dゲームファンのための「KILLZONE 2」グラフィックス講座(前編) -GAME Watch」
http://game.watch.impress.co.jp/docs/se ... 25909.html

Re: ポイントライトによる影の生成について

Posted: 2014年2月13日(木) 21:49
by coc
なるほど・・・。
スポットライトの角度を広げればある程度代用可能ですが、結局それでも同じ問題が発生してしまいますね・・・。
皆さんどうしてらっしゃるのか気になる限りです。

90度区切りが妥協出来るラインですが、4回Zバッファを作るのはどうなのでしょうね。
流石に処理落ちしてしまうかもですかね。
ちょっと試してはみたいですがZバッファ情報を複数保存してシェーダーから取り出す処理が分からないので考えてみます。

Re: ポイントライトによる影の生成について

Posted: 2014年2月13日(木) 21:56
by softya(ソフト屋)
個人では、余りやってないんじゃないでしょうか。
搭載しているとしたらゲームエンジンの物を使っているとかの可能性が高いです。

【補足】
調べてみたら、DIrectXの例はありました。
「DirectXの話 第104回 - もんしょの巣穴」
https://sites.google.com/site/monshonos ... irectx-104

全方位シャドウマップが1つの解の様です。

Re: ポイントライトによる影の生成について

Posted: 2014年2月14日(金) 14:50
by coc
取り敢えず現在自キャラが北(90度)を向いているとして

22,5度方向の右前90度円
112,5度方向の左前90度円
270度方向の背後180度半円

を作成しようとしております。


そこで影生成関数を三回呼び出し、影用深度記録画像のそれぞれに対して上記した円の範囲指定し、その範囲内で影を生成しようとしております。
方向についてはLightDirectionで指定出来ますが、この範囲指定というのをどう行えば宜しいのでしょうか?

頂点シェーダーを見ている限り、ローカル座標の大元をこの範囲で指定させる事が出来れば上手くいきそうなんですが、そもそもローカル座標を範囲指定する方法が分からず困っております。

テクニック部という場所から頂点シェーダーを呼び出しているので、頂点シェーダーではなくテクニック関数部分(呼び出し部分)の関数をいじらないと駄目な気もしますが、そちらを参照する方法も分かりません・・・。

Re: ポイントライトによる影の生成について

Posted: 2014年2月14日(金) 14:59
by softya(ソフト屋)
点光源の影が本当に必要かも検討された方が良いかと思います。
PS3/PS4クラスなら使って当り前だと思いますが、ゲームライブラリやゲームエンジンの担当者が実装すべきことで、ゲーム部分のプログラマが担当するべき範疇を超えていると言えます。
「いや、勉強やゲームシステムの仕様に関わるので、どうしても実装したい」と言うなら止める気は無いのですが。
描画負荷が高い処理、実装コストが高い処理なので代用できる手段が有るのなら、それを検討するのもプログラマのやるべきことだと思います。

Re: ポイントライトによる影の生成について

Posted: 2014年2月15日(土) 00:26
by coc
どうしても実装したい処理であったため今日一日全て使って考えてみましたが、結局の所何も進展しなかったので諦める事に致します・・・。
有り難う御座いました。

Re: ポイントライトによる影の生成について

Posted: 2014年2月15日(土) 08:31
by softya(ソフト屋)
coc さんが書きました:どうしても実装したい処理であったため今日一日全て使って考えてみましたが、結局の所何も進展しなかったので諦める事に致します・・・。
有り難う御座いました。
満足できる処理に仕上げるには、何日、あるいは何週間もかかるかも知れませんよ。そのぐらいの処理なので、必要性を聞いたわけです。

Re: ポイントライトによる影の生成について

Posted: 2014年2月15日(土) 15:32
by coc
暗さを表現したかったのでかなり実装したい処理ではありましたが、特に影を主役にするゲームという訳でもないので必須というほどではないと思います。
ただあと少しで出来そうな気がしていたので、時間が空いた時にでも頑張ってみます。

Re: ポイントライトによる影の生成について

Posted: 2014年2月16日(日) 23:00
by softya(ソフト屋)
coc さんが書きました:暗さを表現したかったのでかなり実装したい処理ではありましたが、特に影を主役にするゲームという訳でもないので必須というほどではないと思います。
ただあと少しで出来そうな気がしていたので、時間が空いた時にでも頑張ってみます。
あと、他に参考にする人もいるかもしれませんので書き込んでおきます。
点光源の影(特にクオリティの高いシャープな影)は非常に負荷の高い処理で、PS4でも複数の点光源を使うとかの無茶が出来ないシロモノです。
アマチュアが手を出すのは非常に高レベルと言っても良いと思います。
趣味で極めたい & 実用レベルでなくても良い & 時間がかかってもやり遂げる ぐらいの覚悟が必要かと思います。
簡単なのならDXLIBでも実装できるかもしれませんが、それでも時間がかかる割には満足出来ないものが出来る可能性が高いと私は予想しております。

いや、DXLIBこんなすごいのが出来たよ!ってのがあれば見せて頂けると嬉しいです。
coc さんも時間があれば、ぜひチャンレンジしてみてください。