ひとことで
地面を格子のマスに分け、各マスに小さな模様(花、石、染みなど)をランダムな位置・回転・大きさ・種類で「爆撃」するように散らす手法です。同じタイルをそのまま並べたときに目立つ規則的な繰り返しを、テクスチャを増やさずに消せます。シェーダー内で計算するので、どこまで広い地面でも模様が途切れず、メモリも増えません。
ゲームでの使いどころ
- 広い地面:草原の花、荒野の小石、床の汚れや染み、森の落ち葉。
- 壁や床のディテール:ひび、傷、苔の斑点、錆のむら。
- 岩・地形の反復対策:トライプラナーで貼った岩肌の繰り返しを崩す。
- デカールの代わり:個別のデカールオブジェクトを置かずに、散らばった模様を 1 つのマテリアルで表現する。
しくみ
- 座標 を格子のマスに分ける:
- 各マスのハッシュ値から、模様の有無・中心位置・回転角・大きさ・種類を決める。
- 模様はマスの境界をまたいではみ出すことがあるので、自分のマスだけでなく周囲 8 マスの模様も評価して重ねる。
これはウォーリーノイズの「セルごとに特徴点を置き、周囲のセルも探索する」構造とまったく同じです。模様の画像を 1 枚用意しておけば、各マスではその画像を回転・拡大した UV で読むだけです。
| 置き方 | 残る規則性 |
|---|---|
| 同じタイルの繰り返し | 配置・向き・種類がすべて同じで、格子がはっきり見える |
| 回転だけランダム | 各マスの中央に 1 つという格子状の並びが残る |
| テクスチャボミング | 位置・向き・大きさ・有無がばらばらになり、格子が見えなくなる |
実装のポイント
- コスト:9 マス分のテクスチャ読み込みになります。模様がマスからはみ出さない大きさに制限すれば、評価するマスを 4 つ(近い角の 2×2)に減らせます。
- ミップマップ:回転した UV の微分が不連続になり、模様の縁でミップマップの選択が乱れることがあります。
textureGradで元の UV の微分を渡します。 - 地面の色むらと組み合わせる:模様を散らすだけでなく、下地にも大きなスケールのノイズで色むらを付けると、繰り返しがさらに分からなくなります。
つまずきやすい点
- 模様が重なって不自然:密度を上げすぎると、花と石が重なり合って不自然になります。種類ごとに優先順位を決めるか、密度を下げます。
- 1 種類の模様だけでは単調:散らし方がランダムでも、模様が 1 種類だとすぐに見慣れてしまいます。数種類のバリエーションを用意します。
- 法線やラフネスも一緒に:色だけを散らすと、光の当たり方が模様と合いません。法線マップや粗さマップも同じ変換で読みます。
デモで試すこと
- 「模様の置き方」を同じタイルの繰り返しにして、遠くの地面を見てください。花と石が一定間隔で整列しているのがすぐに分かります。
- 回転だけランダムでも、各マスに 1 つずつという並びは残ります。「格子を表示」で確かめてください。
- テクスチャボミングでは、同じ 2 種類の模様しか使っていないのに、自然に散らばった草原に見えます。「模様を置く確率」で密度も調整できます。