テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル


log

2014.03.20 C++:経路探索


最近コメントスパムがひどくてすっかり更新する気力がなくなってますががが…。
ひとまず、明けましておめでとうございます!笑

今回は今まで経路探索をやってなかったなぁと思い、経路探索を実装してみました。
経路探索の手法ではA*が一番利用されてて有名だと思いますが、とりあえず基本から覚える
ためにダイクストラ法で実装してみました。

ダイクストラ法というのは経路探索のためのノードと隣接情報を元にして隣接ノードまでの
コストを求め、そこからゴールまでの最小コストとなるリンクを求めるといった感じです。
云ってしまえば総当たりですね笑。そして動画を見てもらうと分かりやすいですが探索ノードが
ポリゴン単位のため、最適な経路ではなく変な進み方をします笑。

ポリゴン単位ではなく、モデルと壁の凸角をノードとして探索することで最適な経路が
求まりますが、この辺りはまぁA*も含めて次の機会に実装しようと思います苦笑。

追記:

投稿した動画の関連として出てきて見つけた動画ですが。
ジャンプを考慮した経路探索になってます。素晴らしい!

2013.12.31 お気に入り:今年最も注目を受けたゲームや映画

今年一年を振り返って最も注目したゲームや映画たち

ゲームだとGTA5,The Last of Us,ドラゴンズクラウン、映画だとパシフィック・リムを
挙げている人が多いですね。

GTA5はPS3で動的(?)な水面の反射表現をやっていて、海のビジュアルがすごく次世代
的で印象的だと思いました。何気に自分もこの影響を受けて、DirectX9世代のGPUでも
実装できる高速な近似反射手法を思いついたのでまずは年初めに実装したいと思います。
(ちなみにRLRや環境マップでは無いですが、誰しもが一度は思いついてそうな手法です笑)
ここのWorldLightMapも実装させてみたいですが、こういうのって権利的にどうなってる
のかよく分からないんだよなあ。

年賀イラストは今からのんびり描くとして笑、それでは良いお年を。

2013.12.23 お気に入り:PS4で気になるゲーム

せっかくなので、もう少し更新。
YouTubeでPS4のゲームプレイ動画を眺めていて気に入ったものを
メモがてら、いくつか紹介。


他のPS4作品はCG臭さが僅かに残るリアリティですが、このゲームは
どの部分をとっても実在感が凄い!!と思いました。曇り空で一面
雪のシーンなので作り込みやすいっていうのもあるけど、そういう
持っていき方も含めて、ただただうめぇです。


一部のシーンで誰もがRDRぽいと感じるところがありますが笑。
このクオリティでオープンフィールドなゲームがやりたい。


FF12が好きなので、こういうアクション方向への進化はとても期待
できそうだなと思いました。うーん、動きの処理どうなってるんだ…気になる。

2013.12.23 制作:更新色々とStableSMの話


すごく間が空いてしまいましたが、久しぶりに動画をとってみました。
制作を中断していた訳ではないんですが、最近はやたらスパムが多かった
ので、スパムが治まるまで更新する気になれなかったんですよね。。

更新した内容が多々あってうろ覚えですが、大雑把な内容としては
・エンジン部分とゲームコード部分の分離
・テンプレートシングルトン、アロケータクラス等のデザインパターンの導入
・シェーダの改良、Stable ShadowMapの実装

こんな感じです。とりあえず今回はStable ShadowMapについて少しだけ説明してみます。
Stable ShadowMapは名前の通りシャドウマップを安定化する手法であり、
シャドウマップのライトが移動することによる影のがたつきが軽減されます。
具体的にどういうことをしているかというと、、"ライトをシャドウマップの
テクセルサイズの単位で移動させる"、たったこれだけです笑。
ただこの手法であっても動くオブジェクトではやはりガタツキが起きます。
また、今回の動画のようにライトの回転でもガタツキが発生してしまいます。
結局この問題を解決するにはCascaded Shadow Mapを実装するのが一番現実的
なようで、現在ではStable + Defferd + Cascaded Shadow Mapが主流ぽいです。

や、やばい。Deffered RenderingもCSMもまだ実装してないよ苦笑。

2013.05.22 C++:Oceanシェーダ

ファイル 434-1.jpg

今回はNvidiaのサンプルを元にOceanシェーダを実装してみました。今のところは不透明
な海なので少し問題がありますが、後は深度マップを参照して色の濃さを設定したり
屈折処理を加えることでそれっぽい画になるかなといった感じです(試験的なものなので
海の上に立っていることとかはとりあえず無視してください笑)。

後、最近やたらとスパムが多かったので、試にこの日誌のアドレスを変えました。おそらく
登録タイプのロボットだったのか、アドレスを変えてからはスパムが来なくなったのでとり
あえずはOK…だと思いますが、RSSを利用していた方はお手数ですが再設定をお願い
致します。

まぁ、RSSを利用している人のサイトで説明しようかと思ったのですが…、全員把握できて
いるのかちょっと不安だったので、とりあえずこちらに乗せておきます。
「アレ、日誌消えてる?」と思った方はすみませんでした苦笑。

2013.05.19 C++:すごく今更な法線マッピング

ファイル 433-1.jpgファイル 433-2.jpg

今現在はライティング計算はある程度それっぽいものの頂点単位の法線だと限界が
あるなと思い始めたので、法線マッピングを試験的に実装させてみました。

「今になって法線マップの実装かよ!」っていわれそうですね笑。
ちなみに接線と従法線はここの方法で求め、法線マップはNVidiaのPhotoshopプラグイン
サクっと作成してみました。
ワンタッチ生成なので法線の精度は雑ですが、理論的にはこれであっている感じでしょうか。
ぶっちゃけると、プログラム側の実装よりもどうやって法線マップを作成するかの方が
手間がかかるんですよねぇ苦笑。

追記:
ネット上にある法線マップを使った球の画像も追加してみました。
こちらの方が分かりやすいかな。

追記2:
動画にしてみました。

2013.05.15 C++:深度プリパスの導入

今回は色々ポストエフェクトを導入して速度が落ちてきたので深度プリパスを使用することで
速度が向上できるのではないかと、ちょっとした実験をしてみました。

その前に深度プリパスについて少しだけ説明でもしておきます。
通常はカラーバッファ+深度バッファで描画し、深度値が描画されている深度値より
手前の場合にバッファを更新するというのが古典的な手法ですが。これだと複雑なシーンだと
無駄なアウトプットがかなり増えてしまいます。例えばビルや家や木が複雑に立ち並ぶ
シーンだと、酷いケースで地面と空の描画で1~2ピクセル、ビルや家や木の描画でもう
5~10ピクセル、キャラクターの描画でさらに3~5ピクセルといった感じで同じピクセルに
10数回以上描画するケースが発生したりします。けれど不透明なピクセル群ならば実際に
必要な色は最後に描画する1回だけでいいはずです。
これを解決する手法が深度プリパスであり、深度値の書き込みとカラーの書き込みをそれ
ぞれ別のパスに分け、最初に深度値だけ書き込み、次のパスでカラーを書き込む際は
深度値が深度バッファの値と同一の場合にだけ書き込むようにすることでカラーバッファ
への描画がピクセル当たり1~2ピクセル程度に抑えることが出来るようになります。

マルチレンダーターゲットはアウトプットが大きくなるため、そこで今回は深度プリパスで
高速化できるのかどうか検証してみましたが。レンダーターゲット3枚で36FPS程度のシーン
が40FPSまで上がるようになりました。いやぁ、思ったより速度が上がりました笑。
マルチレンダーターゲットが1~2枚の頃に試した時は速度が上がるどころか少し落ちた
ような記憶があるのですが、今回深度プリパスは意外と使えることが分かりました。

2013.05.14 C++:FXAA 3 Quality

ファイル 431-1.pngファイル 431-2.png

今までは通常のFXAA3でアンチエイリアシングを行っていましたが、今回はその上位版(?)
であるFXAA3Quality(FXAA3Q)を実装してみました。

FXAA3は他でもよく言われている通り、全体的に少しボケた感じの画になりますが
FXAA3Qの方はよりくっきりした感じの画になりました。それとQualityという名前がついて
いるのでAA自体の品質も上がるのかなと思いましたが、自分の目で確かめる限りでは
FXAA3と同程度(8xAA)な感じですね。ただしボケが無くなると鳥瞰でみてもキャラクターが
くっきり視認できるのでメリットは結構大きいなと思いました。

それと以前にライティングを改良しましたが、1つのシーンだけであれこれやっても、
いざ他のシーンになった時に不自然なライティングになりそうだなと思ったので今回は
シーンを変えて試してみましたが。…やっぱり少しおかしくなってました笑。
今まではPRT色・自己反射色・半球色を1:1:1で合成していましたが、今回の画像では
1:0.5:1.3に改良することになりました。
一番いいのは自身の制作部屋の3Dモデルを作ってライティングが同じになって見えるか
確認する方法だと思いますが、、自分の部屋は汚いしこれはこれで大変だ苦笑。

2013.05.12 C++:アウトラインの色分け

ファイル 430-1.jpg

今まではモデルのアウトラインを描画する場合、同じ色でしかを描画できない制限があった
のですが、今回はそれを改善させてマテリアルごとにアウトラインの色を分けて描画
できるようにしてみました。ちなみに以前、RGB3成分を1つにまとめる手法を実装した
ことをほんの少しだけ書きましたが、それはこれがやりたかったからなのでした。

何故わざわざ圧縮する必要があるかというと、DirectX9ではマルチレンダーターゲットは
最大4枚までですが、今現在は以下のように3枚使用しており、
・カラー+アルファ  (A8R8G8B8)
・深度+グロー強度 (R16B16)
・法線         (A8R8G8B8)
将来的には速度マップを4枚目に格納して2.5Dモーションブラーを搭載したいため
アウトラインの色がピクセルごとに乗せれないなぁ、と悩んでいて、モーションブラーを
切り捨てたり、アウトライン描画をモデル押し出しの手法に切り替えるといったことも
考えましたが。今回ふと思いついた「切り捨てるんだったらアウトラインの色の方を減色
して法線のバッファに格納すればよくない?」という逆転の発想に落ち着きました。

そして今回は実装しながら「我ながらいいアイデアだなあ」なんて思ったのでした笑。

2013.05.10 C++:被写界深度


被写界深度を実装させてみました。

実装方法はネットで載せられている方法と同じなので、これといって説明することも無い
ですが。今回は工夫として、被写界深度用にぼかした画像をサンプリングする際にRGB
ごとにサンプリング先をずらすことで、色収差っぽい表現になるようにしてみました。
分かりやすく例えてみると、メガネを掛けていて右か左をみると色がずれて見えるアレです。
メガネを掛けている人なら「あぁ、これね」ってわかると思いますが、分からない方は
動画を拡大してみて、境界部分が青くなっていたりオレンジ色になっている部分があったら
それだと思って下さい。まぁ、実際はグレア部分でもそうなってるんですけどね苦笑。
現象を言葉で説明するって難しいな。

それにしても、被写界深度以前に動画のエンコードの時点でボケてしまっているのが
何とかならないものか…。アップロード前はほとんど大丈夫なのに、YouTubeの奴め。