スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[DirectX9]HDRライティング




HDRライティングを実装したので、備忘録です。
実装に関していろいろ書こうかと思ったけど、実装は結果的にDirectXのサンプルのまんまになってしまったので、DirectXのサンプルを実装するにあたって、参考になりそうなことをつらつらと書いていきます。

HDRと「いい感じの画面」

HDRとはハイダイナミックレンジの略で、HDRレンダリングは「ディスプレイの表現できる限られた色(1677万色)を超えた、色でレンダリングすること」です。

これで何をするのかというと、ディスプレイ上での色ではなく、現実の光の量をレンダリングします。
ルクスとかそういう類のイメージです。
月明かりが1ルクス、晴れの日の屋外は100,000ルクスだそうで、明暗が99,999ルクスの差あります。この差をいい感じにごまかしていたものを、ちゃんと計算するのがHDRレンダリングで、その計算結果にトーンマッピングやブルームなどのエフェクトをかけて「いい感じの画面」を作ります。

3Dグラフィックス・マニアックス 41 HDRレンダリング(1)~HDRレンダリングとは?

具体的にやること
1.HDRレンダリングに対応する
2.トーンマッピングする
3.エフェクトをかける

各エフェクトの効果は下記のサイトが分かりやすかったです。

ラーメンは味噌汁 - OpenGL ES 3.0 @ RGB10_A2フォーマットでHDRレンダリング

実際の実装はDirectXのサンプルのまんまになってしまいましたが…。

HDRLighting サンプル


1.HDRレンダリングに対応する
0.0f~1.0fの世界を超えたレンダリングをするようにシェーダーを書き直します。
お手軽なのは光源のディフューズカラーを50倍するとか。
ここを突き詰めたものが、物理ベースレンダリングです。いつかやりたい。

そして、シェーダーのレンダーターゲットにD3DFMT_A16B16G16R16FなどのHDRフォーマットのテクスチャを指定します。
各種エフェクトをかけるときもHDRテクスチャを使うので、定数とか使ってHDRでないテクスチャをごっちゃにしないように注意します。

2.トーンマッピングする
画面の平均輝度を計算して、その輝度を元にディスプレイでの表示に合わせて補正します。

この辺の実装はいろいろあるようですが、論文を参考にした実装のDirectXのサンプルがいい感じでした。
自力で「いい感じ」にしようとするとドツボにはまりますので注意です(2日ぐらい吹き飛んだ)

3.エフェクトをかける
「眩しい」を表現するために、ブルームやグレアなどのエフェクトをかけます。

実際の描画で使われるのはトーンマッピング後のテクスチャなので、これらのエフェクトもトーンマッピングを掛けたテクスチャを元に計算します。
「明るく見える白いところを抽出」ではなく、本当に「明るいところ」を抽出出来るようになるのもHDRのいいところです。

実装にあたって
元々いろいろテクニックを書いた状態でのHDR対応だったので、シャドウの部分の減衰とかも見直したりしました。

レンダーターゲットを切り替えたり、テクスチャとサーフェイスを沢山用意したりしますが、この辺りは予めクラス化してあったので、カスタマイズが楽でした。

参考文献
3Dグラフィックス・マニアックス 41 HDRレンダリング(1)~HDRレンダリングとは?

ラーメンは味噌汁 - OpenGL ES 3.0 @ RGB10_A2フォーマットでHDRレンダリング

t-pot『Tone mapping』

HDRLighting サンプル
スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
プロフィール

ぴお

Author:ぴお
ようこそ

自分のゲーム制作での備忘録や製作記録を書き留めておくブログです。

■やってるサービス
Twitter:piorimumu

Pixiv
http://www.pixiv.net/member.php?id=1126385

Twitter
このページのトップへ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。