みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

シェーダーで視線シミュレーション

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

シェーダーで視線シミュレーション

投稿記事 by みけCAT » 11年前

先日の日記でOpenGLのシェーダーの話を書きましたが、
今度はみんな大好き[要出典]DXライブラリのシェーダーの話です。

DXライブラリで3Dの描画をするときは、普通(標準関数で)はポリゴンを大量に描画して球を表現すると思います。
しかし、今回のプログラムでは、カメラの「視線」をシミュレーションすることにより、画像を描画します。
そのため、大量のポリゴンを用意しなくても、球なら「球」を1個置くだけで表現できます。
やることのイメージとしては、こんな感じです。
sisen_simulation_image.png
視線シミュレーションのイメージ
sisen_simulation_image.png (30.07 KiB) 閲覧数: 314 回
今回の実験の前に、C言語で「視線シミュレーション」を行うプログラムを書いていました。
その出力の例がこれです。
gazou_seisei_sample.png
視線シミュレーションにより生成した画像のサンプル
(4096×4096で出力したものをImagemagickで512×512に縮小したもの)

これをシェーダーに移植。長いのでps_2_0ではなくps_3_0にしないといけませんでした。
► スポイラーを表示
このシェーダーをDXライブラリを使ったプログラムから呼び出し、
無事先ほどの画像と同じような画像(もう少し荒いですが)を作成することに成功したのですが、
せっかくDXライブラリ+シェーダーにしたので、やはり画面を動かしたいです。

というわけで、球・カメラ・ライトの操作を可能にしました。
球には力(プログラム的には加速度)を加えることができるようにし、
カメラ・ライトは直接速度を与えて動かせるようにしました。
その結果がこれです。
[youtube][/youtube]
動画だと録画ソフトの影響かFPSが低いですが、録画しなければ640x480、1倍描画で約60FPS出ました。

動画で使用しているプログラムではまだ実装していませんでしたが、
ここで配布しているプログラムではn倍描画(n=2,4,8)にGraphFilterを使用することができ、
使用すると4倍描画および8倍描画の時は画質が改善しました。
ただし、自分の環境では640x480、8倍描画でGraphFilterを使用しようとすると、
1フレームの描画に1秒以上かかり、実用レベルではなくなってしまいました。

今回作成したプログラムを添付しました。
DXライブラリを自分でビルドし、使わない機能を省くことで、実行ファイルのサイズを減らしています。
副作用として、ログも文字化けしなくなりました。
添付ファイル

[拡張子 zip は無効化されているため、表示できません]


アバター
usao
記事: 1889
登録日時: 12年前

Re: シェーダーで視線シミュレーション

投稿記事 by usao » 11年前

>視線シミュレーション
要するにレイトレですね.
遠方地面のエイリアシングが癖になりそうです.

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前

Re: シェーダーで視線シミュレーション

投稿記事 by Hiragi(GKUTH) » 11年前

ちょっとやってみました。初期解像度では9倍まで上げてみましたが60FPSを保っています。というか4倍以上ではほとんど違いが判らない・・・
で、次にフルHDのフルスクリーンでやってみたところ8倍の地点で50FPS程まで低下し、9倍では描画されずに強制終了になったようです。
てか4倍以上はフルHDでもわからない...
GPU-ZでGPUのロード見てるとほぼフルロードされてました、なんというか、偶数倍のときはアンチエイリアシングがかかって見えたような・・・?

i5-4670, GTX760