11

コンピュータゲームはどのように彼らの立場を表現しますか?ジオメトリにハイトマップを使用しますが(後で最適化します)、たとえば、地面を「ペイント」するのに最適なテクニックは何でしょうか。ほとんどの場所に草が生え、あちこちに土の道があり、町の中に砂利があり、各タイプの材料の間をスムーズに移動します。

巨大なプリベークされたテクスチャを使用するだけですか?既存のテクスチャを並べて表示できる場合、これは非常に非効率に思えます。では、既存のテクスチャごとに巨大なアルファマップを使用しますか?理論的にはそれは私には大丈夫に聞こえますが、実際にそれを行うにはどうすればよいですか、そしてその結果はどうなりますか?私は本当にどこから始めればいいのかわからないし、私のグーグル検索はあまり効果的ではない。

テクスチャをグリッドに「スナップ」する必要はありません(つまり、スペース(0,0)は草、スペース(0,2)は土、スペース(0,1)は草-土の遷移)。もっと説得力のあるように、任意にペイントできるようにしたいと思います。もちろん、それは簡単な方法ですが、グラフィックスの品質と「リアリズム」の犠牲が多すぎます。

私は主にここで理論とオプションを探しています。私はOpenGLを使用しているので、OpenGLのやり方や、聞いたことのない機能についてのヒントを提供できれば、それは素晴らしいことです。

明確にするために、忘却は私が探しているものについての良い参考資料です。地面のジオメトリ(高さマップ、静的3Dモデルなど)がどのようになっているのかはわかりませんが、私が話しているように、それらの地形にはさまざまな地面の種類とスムーズな遷移があります。これが画像の例です。石畳が非現実的ですがスムーズに草に溶け込んでいることに注目してください:http ://www.elitistsnob.com/images/Oblivion%202006-05-21%2008-38-25-15.jpg

また、ゲームプログラミングの宝石の本の1つでこれについて読んだと思いますが、当時はあまり注意を払っていなかったため、夏になったため、大学の図書館にアクセスして確認することができません。現在目次を探しており、見つけたら編集しますが、8月中旬まで読めません。

編集:ああ、ゲームプログラミングジェムズ7には「屋外地形レンダリングのための大きなテクスチャのマッピング」というタイトルの第5.8章があります。これはまさに私が必要としているように聞こえますが、私のUのライブラリにはその本さえありません!他のゲームプログラミングの宝石の本では、このようなものを正確に見つけることができませんでしたが、いくつかの地形幾何学の記事がありました。

4

6 に答える 6

10

私は最近、OpenGLで、あなたが話しているのと同じようなことをする小さな地形レンダリングエンジンを書きました。私が使用する手法は、テクスチャスプラッティングとして最もよく説明されています。

これを実現するために、5つのテクスチャを使用します。これらのテクスチャのうちの4つは、草、岩、水、砂の詳細テクスチャです。これらのテクスチャは小さめの512x512テクスチャであり、地形全体に並べて表示されます。5番目のテクスチャはミックスマップです。ミックスマップは、地形全体をカバーする巨大なテクスチャです。私の場合は4096x4096です。

MixMap

このミックスマップは、4つのカラーチャネル(r、g、b、a)をすべて使用して、その特定の場所に表示する詳細テクスチャの量を記述します。私は赤いカラーチャンネルを使用して、砂の不透明度、緑は草、青は水、アルファは岩を決定しています。このミックスマップは、初期化時の高さマップに基づいて計算され、高度を使用してこれらの値を決定します。たとえば、海面近くでは主に水が欲しいので、青の水路に高い値を設定し、他の水路に低い値を設定しました。山に入ると、岩のテクスチャがたくさん必要なため、アルファカラーチャンネルを高い値に設定しましたが、他のすべてのカラーチャンネルは低い値に設定しました。

フラグメントシェーダー

次に、このミックスマップはフラグメントシェーダーで使用されます。ここで、ミックスマップのこれらのカラーチャネルを取得し、それらを使用して詳細テクスチャを結合します。フラグメントシェーダーに使用しているGLSLコードは次のとおりです。

uniform sampler2D alpha;
uniform sampler2D grass;
uniform sampler2D water;
uniform sampler2D rock;
uniform sampler2D sand;
uniform float texscale;

varying vec3 normal, lightDir ;

void main()
{
   // Get the color information
   vec3 alpha    = texture2D( alpha, gl_TexCoord[0].st ).rgb;
   vec3 texSand  = texture2D( sand, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texGrass = texture2D( grass,  gl_TexCoord[0].st * texscale ).rgb;
   vec3 texWater = texture2D( water, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texRock  = texture2D( rock,  gl_TexCoord[0].st * texscale ).rgb;

   // Mix the colors together
   texSand *= mixmap.r;
   texGrass = mix(texSand,  texGrass, mixmap.g);
   texWater = mix(texGrass, texWater, mixmap.b);
   vec3 tx  = mix(texWater, texRock,  mixmap.a);

   // Lighting calculations
   vec3 dl = gl_LightSource[0].diffuse.rgb;   
   vec3 al = gl_LightSource[0].ambient.rgb;
   vec3 n = normalize(normal);
   vec3 d = tx * (dl * max( dot ( n, lightDir), 0.0 ) + al );   

   // Apply the lighting to the final color   
   vec4 finalColor = vec4( min(d, 1.0), 1.0);
   gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}

均一なtexscaleは、ディテールテクスチャが地形全体で何回タイリングされるかを決定する値です。値を大きくすると、ディテールテクスチャがより鮮明に見えますが、繰り返しが表示されるリスクがあります。

于 2009-07-10T18:05:54.817 に答える
1

プリベークは間違いなく非効率的ではありません。ランタイムコードはブレンディングやその他の計算を行う必要がないため、実際には最も効率的です。テクスチャをレンダリングするだけです。もちろん、動的な手法により、ツールチェーンが簡素化され、より多くのオプションが提供されます。

于 2009-07-10T17:25:21.077 に答える
1

IDは、QuakeWarsで単一の大きな「メガテクスチャ」(32K ^ 2-128K ^ 2を話している)を機能させたようです。

カーマックとの興味深いQ&Aがあります

http://web.archive.org/web/20080121072936/http://www.gamerwithin.com/?view=article&article=1319&cat=2

(元のリンクは現在無効になっているようですが、SOはインターネットアーカイブリンクに問題があるようであるため、上記のリンクを作成していません。編集プレビューで見栄えが良く、メインページで壊れます)。

于 2009-07-10T18:07:18.403 に答える
1

たとえばsource(hl2)エンジンで使用される標準的な方法の1つは、頂点ごとのアルファを使用して2つのマテリアルをブレンドすることです。資料は通常、少なくともアルベドと法線マップで構成されています。ソースエンジンでは、「ブレンドテクスチャ」マテリアルごとに2つのマテリアルのみが許可されますが、これは一種のくだらないものです。

2つ以上のマテリアルが必要な場合は、さまざまなテクスチャでさまざまなディスプレイスメントをテクスチャリングしてシミュレートする必要があります。個々のタイルに含まれるマテリアルは最大で2つだけにしてください。

ピクセルごとではなく頂点ごとにアルファを設定すると、外観がかなり悪くなります。Oblivionで述べたように、たとえば石畳が砂にスムーズに溶け込みます。この欠陥には修正があります。ピクセルごとにアルファを変調する別のテクスチャを使用して、石畳の石の間の亀裂が砂で簡単に埋められるようにしますが、補間された頂点のアルファが石畳のほぼ0になるまで、石畳の石の上部はほぼ1.0アルファのままです。材料。これにより、醜いスミアではなく、トランジションの見栄えを良くすることができます。

アルファを含む低解像度のテクスチャを使用することもできます(ただし、頂点ごとに1アルファよりはるかに高くなります)。タイル状のテレーンテクスチャは2048x2048である可能性がありますが、それらをブレンドするために使用されるテクスチャは、テクセルごとの解像度を必要としません。256x256の8ビット/テクセルテクスチャは、ミップマップでわずか96kBです。

于 2011-04-29T20:48:28.423 に答える
0

通常、トランジションエリアは事前に作成されていますが、アルファチャネルやテクスチャのブレンドを使用していくつかのことを行うこともできます。

于 2009-07-10T17:27:00.387 に答える
0

タイリングから逃げることはできませんが、地面に少しノイズを出すベーステクスチャを使用すると、タイリングがないように見えます...

アルファテクスチャと同じテクスチャ座標を持つベーステクスチャを使用します。ベーステクスチャは何でもかまいません..サテライト画像、または草のテクスチャ..地面の形状に関連している場合は完璧に一致します。

草や岩のテクスチャにシームレスなテクスチャを使用してみてください...それは解決しませんが、問題がないように見えます

于 2009-07-12T14:45:53.310 に答える