地形をテクスチャマップする方法は何ですか?


10

私は3DゲームでXNAを使用していますが、適切で快適な環境を作ろうとしています。ハイトマップから地形を作成するためのチュートリアルを実際に実行しました。テクスチャを付けるには、草のテクスチャを適用し、何度もタイルを張ります。

しかし、私がやりたいのは、本当にリアルなテクスチャリングを作成することですが、それを自動的に生成することもできます(たとえば、Perlinノイズを使用してテレインを生成してからテクスチャーを作成する場合)。

マルチテクスチャリングについて学び、さまざまなテクスチャのさまざまな色でマップファイルをロードしましたが、これは本当に効率的ではないと思います。たとえば、崖や非常に急な領域の場合、テクスチャがタイル状に表示されるため、上。(また、どのようにして道路やダートパスを描画するかわかりません。)

手続き的に生成された地形を現実的にテクスチャマッピングする効率的なソリューションを探しています。


1
マッピングの問題はささいなことではありません。いくつかの段落では適切に答えることができません。ハーモニックマッピングとこのペーパーで説明されている内容を確認することをお勧めします。cs.ubc.ca
papers

回答:


2

ブレンドマップやテクスチャスプラッティングは(UVマッピングとは無関係であるため)気にする必要はないと思います。マッピングによって生じる歪みを最小限に抑えることを具体的に求めたので、このGPU Gems記事のセクション1.5を参照できます。

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch01.html

これは、手続き的に生成された地形でも機能します。このコンセプトは、「トリプラナーテクスチャリング」とも呼ばれます。

後で編集:マッピングに事前計算されたUVを使用せずに、自分のテレインレンダラーでこのテクニックをテストしました。3つの異なる投影面(XY、YZ、ZX)の3セットのUVを計算するだけです。これは、単純な頂点およびフラグメントシェーダースニペットを使用して実現できます。

VShader:

float tileSize = 2.0;
vec4 worldPos = ( gl_Vertex);//So we obtain the world position

TexCoordX = (worldPos.zy/tileSize);//here are our texture coordinates...
TexCoordY = (worldPos.xz/tileSize);
TexCoordZ = (worldPos.xy/tileSize);
normal =  gl_Normal;
wNormal = normal;

FShader:

vec3 n = wNormal;
n*=n;
vec2 tcX = fract(TexCoordX);
vec2 tcY = fract(TexCoordY);
vec2 tcZ = fract(TexCoordZ);

vec4 grassCol = texture2D(grassTexture,tcX)*n.x+
                texture2D(grassTexture,tcY)*n.y+
                texture2D(grassTexture,tcZ)*n.z;

3

一連のテクスチャー(草、土、岩)を定義して使用できます。これらの3つのレイヤー(一番下の岩、一番上の汚れ、一番上の草)を使用すると、3つのアルファチャネルを定義して、各テクスチャーの表示量を定義できます。アルファチャネルの単純なノイズマップから始めて、おそらく地形の勾配を考慮に入れます。傾斜が大きいほど、より多くの岩が透けて見えます。これは、私が覚えている限り、「テクスチャスプラッティング」と呼ばれる手法です。ここにあなたが始めるためのいくつかのリンクがあります。 Advanced Texture Splatting(ガマスートラ)

TextureSplatting(charlesbloom、私がこのトピックを始めるために使用したもの)

見栄えの良い結果がかなり速く、非常にやりがいのあるトピックを得ることができるはずです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.