まえまえから興味はあったのですが、ほったらかしてあったので実装してみました。いつものようにプログラムです。2_0])スライダーを動かすと、マップの細かさが変わります。ソースには、いつものように適当にファイルが入っています。大事なファイルは次のものです。1961]らしいです。「4辺に色を塗ったタイルが何種類か与えられた時、与えられた種類のタイルだけを使って接している辺の色が隣のタイルの辺と同じであるようにしながら平面全体をタイルで敷き詰められるかどうかを判定する問題。(http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/undecidable.html)」というのが得られたり、Wikipediaに詳細な情報が詰まっていたりします。sets).で、CG的には、この問題をGPUを使って解くとかでは全然無くて、ゲームを見てると明らかにテクスチャを繰り返しているような場面が見えますよね。使っているようなタイルを使って解消しようという問題になっています。小さなタイルを敷き詰めて1つの絵を作ります。タイルは、各辺にIDをつけておきます。下の例では、各辺に赤と緑のIDをつけています(完成した絵には色は付きません)。IDが同じ辺は右と左及び、上と下でスムーズにつながるようにタイルを作っておきます。上下左右のIDが等しくなるようにランダムにIDを振って、対応するタイルを敷き詰めれば、綺麗につながったランダムな画像が作れます。このタイルを敷き詰める方法は難しくはありません。迷路作成で言えば、棒倒し法と同じ方法を実践します。左上から順番に敷き詰めていきましょう。最初はランダムにIDを振ります。左側はすでに決まっているので、それ以外の上下右をランダムにIDを振ります。そのまま同じように右に進んで上側のパターンを作ります。左側から始めるとしましょう。上の段は決まっているので、下左右にランダムにIDを振ります。その右側は上と左のIDが決まっているので、右と下にIDをランダムに振ってタイルを決定します。以降、端の部分以外は、右と下にランダムにIDをふれば、ワンの絨毯が出来上がります。ここでは、赤と緑という2種類のIDを持つタイルを扱いましたが、IDの種類は何種類でも大丈夫です。IDの種類が増えるほど必要なタイルの枚数が多くなります。必要になるタイルの枚数は、(IDの種類)4で増えます。2種類なら16、3種類なら81、4種類なら256です。3種類か4種類になってくると自動で作るシステムを作らないと駄目でしょうね。今回の実装ですが、2種類のテクスチャを使います。1つは、IDが何かを表現しているランダムな「ハッシュテクスチャ」です。このテクスチャでは、1テクセルがタイルの1つに対応しています。緑成分で上辺のIDを判定します(先ほどまでのIDの1つが赤でもう1つが緑の説明と混同しないように注意してください)。右辺と下辺は隣接するテクセルをサンプリングすることによって情報を得ることができます(少し面倒くさいですが、青成分とアルファ成分に隣接する情報を格納すればサンプリング回数を減らすこともできますが、分かりやすさのために、今回はこの方法を採用しています)。1つは、タイルのテクスチャです。今回は白黒のシンプルなものを使いました。これは、16個のタイルを1つのテクスチャに敷き詰めています。この分解した絵をよく見ると、このテクスチャは良く考えられて構成されていることが分かります(Wei氏が考えたのでしょうか?すごいです)。タイルを縦に見ると、縦に並んでいるタイルは全て左右のIDが同じになっています。タイルを横に見ると、横に並んでいるタイルは全て上下のIDが同じになっています。テクスチャは連続につながっています(wrapまでも考慮に入れて!)。IDからタイルのUV値を演繹的に求められるようになっていますし、それぞれの境界で問題がおきにくくなっています。どのようにIDを求めれば良いかですが、考えるのが面倒くさかったので、単純に条件分岐で作ってみました。四角形ポリゴン全体で0~1となるテクスチャ座標値が入っています。タイルパターンのテクスチャでの相対テクスチャ座標値を最初に入れておき、そのあとハッシュテクスチャからオフセット値を求めます。■シェーダを隠してみたまぁ、某所でも話題としてでていたのですが、エフェクトファイルはあまり他人には見せたくないですよね。いうことで、今回は実行ファイルにエフェクトのデータを埋め込んで見ました。エフェクトのコンパイルには、fxc.exeを使うのですが、いちいちコマンドプロンプトから打ち込むのは面倒くさいのでバッチファイルを作ってみました。(エラーがでたら分かるように、終わったらpauseでとめてみるようにしてみました)。{...};」のような変数ができますので、C++プログラムのほうでは、次のようにエフェクトインターフェイスを作成します。);ポーズがうざいですね。さんにエラーレベルを見てポーズを掛けるバッチファイルをいただきました。一般的にこちらを使うほうが良いと思います。pauseありがとうございました。■最後に実は、ミップマップを掛けてみたらおかしな表示になってしまったんですよ。いうことで、今回ははずしています。使ったものを使うと、下のようになるのですが、エッジの処理で無理があって基のテクスチャに偏りがあるのか、ちょっとパターンが見えます。テクスチャの作成技術も問われるのが難しいところです。効果が大きいので、実際に使っていきたいですね。さんからミップマップ版に変更するソースをいただきました。ハードウェアのミップマップ機能を使うのではなく、全てのミップマップレベルを含む1枚のテクスチャを作成して、そこから全てサンプリングすることによって、タイルの隙間で不整合の起きない正確なミップマップを掛けています。各ミップマップレベルは、1テクセル分の幅だけ周辺に広げており、バイリニアフィルタでも問題が起きないようになっています。エラーのときだけポーズするバージョンもどるimagire@gmail.com。