トップ

ようこそ

ぴおが製作したゲームとか置いてます。


制作物
微塵に砕かれるテンシちゃん


ソードマスターテンシ

初東方二次創作。
ソードマスターのテンシが仇なす敵を微塵に砕く、
テイルズ風ソードアクション。


最近のこと



戦闘ヘリMOD
戦闘ヘリMOD1.4.6対応版つくりました。


東方Project・攻略ブログ
スポンサーサイト

[DirectX9]「VarianceShadows11」をDirectX9で実装した




タイトルのまんまです。
元々、シャドウマッピングを実装していましたが、今回DirectX公式サンプルの「VarianceShadows11」の各種テクニックを実装しました。

前回のHDRライティング同様、実装に関してはサンプルのまんまなので、参考にしたサイトをメモ。

参考文献
VarianceShadows11サンプルは、「分散シャドウマップ」に加えて、「カスケードシャドウマップ」と「ライト空間透視シャドウマップ」などのテクニックも取り入れられているので、各アルゴリズムごとにリンクを貼っておきます。

カスケードシャドウ(Cascaded Shadow Maps)
MSDN - カスケード シャドウ マップ
公式サンプルの解説ページです。

☆PROJECT ASURA☆ [Direct3D 11] 『平行分割シャドウマップ』
「カスケードシャドウ」に焦点を当てた解説が書かれています。
公式サンプルでは分割距離は手動でしたので、こちらで取り上げられていた平行分割を実装しました。
DirectX9ではテクスチャ配列が使えなかったので、こちらのif文での分割シャドウマップの選択も参考にしました。

分散シャドウマップ(Variance Shadow Maps)
【分散シャドウマップ】 – Variance Shadow Maps - | 株式会社ヘキサドライブ |
「分散シャドウマップ」に焦点を当てた解説が書かれています。

OpenGL ES 3.0 @ 分散シャドウマップ - ラーメンは味噌汁
OpenGLですが分散シャドウマップだけのコードも書いてあるので、比較しながらサンプルのコードを読みました。

MSDN - カスケード シャドウ マップ
カスケードシャドウマップの解説ページですが、VSMについても下の方で解説されています。

ライト空間透視シャドウマップ(Light Space Perspective Shadow Maps)
☆PROJECT ASURA☆ [OpenGL] 『Light Space Perspective Shadow Maps』
ライト空間透視シャドウマップに焦点を当てた解説をされています。

その他改良テクニック
☆PROJECT ASURA☆ [Direct3D 11] 『シャドウマッピングの基本』
下のほうに深度バイアスの計算についての解説がありますが、サンプルのRenderVarianceScene.hlslのCalculateVarianceShadow関数でこのテクニックが使われています。
DirectX9では、SampleGrad関数が使えないので、上記のサイトを元にバイアスを計算しました。


[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 サンプル

[Git]はじめてのマージ[SourceTree]

Unityのプロジェクトのマージに3時間かかったけど成功したので、メモ。

マージのやり方

サルでもわかるGit入門 - 6. マージでの衝突を解決する


上記のサイトを参考に、AとBの二人のプログラマの作業をマージするとする。

0.masterから、各々のブランチ「AWork」「BWork」を作って作業する。
(ここからマージ作業)
1.masterをチェックアウト
2.AWorkをmasterにマージ
3.BWorkをmaster(AWork)にマージ
4.競合を解決
5.完了

最初は、何も考えずにこの通りにやろう。
3時間かかった原因はちゃんと調べずに自己流でやろうとしたことだと思う…

SourceTreeでの操作
上記のサイトでは、ターミナルでの操作なので、SourceTreeでの操作について。

チェックアウト
左のブランチから、masterブランチを右クリック→チェックアウト

マージ
上のマージアイコンをクリック→マージウィンドウで、マージするコミットを選択→右下の「OK」をクリック

競合の解決
テラシュールブログ - Unity開発者が複数人で開発を進める上で覚えておくと幸せになる9つの事

上記のサイトより、

マージするには、コンフリクトしたファイルを選択し、競合を解決→相手か自分の変更を使って競合を解決する…を選択する。とりあえず外部マージツールによる解決が難しい場合「相手の変更を使って競合を解決」が基本。



とのこと。

マージ後の並行作業

マージ後は、マージしたmasterからまた分岐して作業するかと思います。
この時気をつけたいのは、「AWork」と「BWork」ブランチはまだマージ前であることです。

引き続き「AWork」「BWork」ブランチを使う場合は、各々のブランチで「master」ブランチからプルを行ってから作業します。

まとめると、マージ後に「AWork」ブランチで作業する場合は、作業に入る前に、

1.「AWork」ブランチをチェックアウト
2.「master」ブランチからプル

をします。

調べると、新しいブランチを都度作って作業したり、そもそもブランチを切らない運用などがあったので、この辺りはチームによりけりでしょうか。

git で master に追いつく?ブランチは都度closeするべき?

「Googleがブランチを切らない開発をしている」ってホントなの?

モデルデータ(.obj)が追跡されない

モデルデータが「.obj」だと、SourceTreeのグローバル無視リストに指定されている可能性がある。

SourceTree が Git のグローバルな無視リストを書き換えて困った話

メニューバーの「ツール」→オプション→Gitタブ→グローバル無視リスト右の編集で、「gitignore_global.txt」を開き、「*.obj」の一行を消して保存する。

metadataが大量の差分を作って鬱陶しい

1.Project Setting/Editer/Version Control をVisible meta dataにする。
2.Asset Serialization ModeをForce Textにする。

Library/metadataの細々したファイルがウザい

metadataを追跡する必要がなくなるだけで、metadataが無くてもいいわけではない。metadataフォルダを削除するとクラッシュしてしまった。

何やってるか分からない

こわくない Git

コミット、ブランチ、マージについては、このスライドを読んだら、かなりイメージがしやすかった。おすすめ。

変更履歴
2016/06/27 とりあえず要所だけ書いた
2016/06/28 マージ後の作業について書いた
2016/07/04 こわくないGitのリンクを追加
2016/07/15 metadataについて追加

[Unity]Animator備忘録

Animatorに苦戦しているので、自分用にメモ。

・AnimatorStateInfo.normalizedTimeは1.0を超える

例えばLoopするアニメーションはループするごとに1.0ずつ数値が大きくなる。

・AnyStateの使いどころ

AnyStateから伸びたTransitionは現ステートに関係なく、遷移条件が揃えば、特定のステートへ遷移を開始する。
例えば、地上のキャラクターがジャンプする時にAnyStateを活用すれば、「待機→ジャンプ」「歩き→ジャンプ」「ダッシュ→ジャンプ」みたいな遷移先が同じTransitionを作らなくても、「AnyState→ジャンプ」だけ作れば済む。

・uGUIをAnimatorで制御するとき、AnimationClipを切り替えたい。

Animationウィンドウの左上のの下にあるドロップダウンリストで切り替えられる。

・参考資料

Unity マニュアル アニメーションステート

【Unity開発】Animator Controllerの遷移設定(Duration等)【ひよこエッセンス】 - Unity5(C#)初心者・入門者向けチュートリアル ひよこのたまご

UnityのuGUIで「UIのアニメーション制御」
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
プロフィール

ぴお

Author:ぴお
ようこそ

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

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

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

Twitter
このページのトップへ