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


log

2012.04.15 C++:ボクセルのライティング

ファイル 389-1.jpg

今回はボクセルのブロックを面単位でライティングするようにしてみました。まだ未完成な
ところが多いですが、ライティングの実装方法については以下の手順で実装させています。

・まず始めに全ブロックの空間ライティング度合いを初期化する。ブロックが存在する場合は
0、ブロックが存在しない場合は最大値(15)で初期化する。
・自身のブロックの隣接5ブロックの空間ライティング値を取得して平均サンプリング・・・(a)。
 cf.上からライトを照射することを想定しているので下ブロックはサンプリングしない。
・(a)の処理を光が伝わる最大ブロック数n(ここでは16)だけ繰り返す。
・各面のライティング度合いはその面の先のブロックの空間ライティング値となる。

こんな感じです。で、これでMineCraftっぽくなるかなぁと試してみましたが、、画像の感じ
になってしまいました。遮蔽している感じはでているため決して悪くはないですが、Mine
Craftでは太陽光が直接伝わるブロックの横のブロックは明るくなるはず(分かりやすく
いうと、マリオの側面は画像より明るくなるはず)なので、このアルゴリズムだとまだ
未完成という訳です。…さて、それよりも問題なのがライティング計算にかかる時間です。

上の計算だと(a)の部分を16回繰り返していますが、(a)の部分は現在500*20*500
ブロック分計算しているため全部で500*20*500*16=80,000,000ブロック分CPUで
計算していることになります。なのでブロック情報を更新すると2秒程度画面が固まる
ようになってしまいました苦笑;重すぎっ!

変更させる周辺だけ情報を更新するようにすれば高速化できるようになりますが。
さてさて、これからどうアルゴリズムを改良しようかな。。

comment