テクスチャをプロシージャルに作成するには、多くの手法があります。
ここでは
Game Programming Gems Vol.1
4.1 フラクタル地形形成 - 断層形成
このアルゴリズムは、ハイトマップを対象とします。
(高さマップ、ここでは各ピクセルに実数が割り当てられている程度の意味)
@ フィールドに直線を引く。
A 直線の一方に、dHeight を加算して行く。
= (オフセット値:定数) +
(i:イテレーション番号)*(適当に決めた値:定数)/ (全印手レーション回数:定数)
以上の単純なアルゴリズムです。
Aのが、だんだんとスケーリングされて小さくなって行くので、フラクタルと筆者は言っているのか、
或いは、断片=フラクタル、という原義なのか、定かではありません。
調整パラメーターは、上記に挙げた定数と、イテレーション回数、そして、
ハイトマップ値の色の分配で模様が決まります。
ハイトマップとして捉えると、色の濃い部分が高い部分、薄い部分が低い部分です。
或いは、その逆に解釈して、ポリゴンマップに落とすことも可能です。
イテレーションを重ねて行けば、だんだんと分解能が細かくなって行って、
それなりに使えそうな地形マップが出来て来ます。
それでも、最初の断層の跡が残っているのが特徴です。
加算する高さによっては、よりはっきりと初期断層跡を残すことが出来るでしょう。
もちろん、様々な解釈で、自由なテクスチャを作ることができます。
今回は、スムージングは、最終的な過程で各ピクセルの周囲の8ピクセルを
加算平均しているだけなので、よりくっきりと残ってしまっているので、よりぼかし方を
工夫すれば、自然に見えるようになるはずかと思います。
一定以上の濃さの部分を白、以下を青とすると、雲テクスチャらしいものも、
出来て来ます。
サンプルコードを置いておきます。ハイトマップのプロシージャル生成のクラスだけです。
CELL の各値を、ピクセルのカラーとして出力する、
或いはポリゴンの各座標(代表点だけでもよい)として出力するようなコードに組み込むと、
よいかと思います。
RandomMap.cpp