質問

コンピューター ゲームはどのように地面をレンダリングしますか?ジオメトリにハイトマップを使用する予定ですが (ただし、後で最適化します)、たとえば地面を「ペイント」するのに最適なテクニックは何だろうと考えています。どこにでもある芝生、ところどころの未舗装の小道、町の中の砂利、そしてそれぞれのタイプのマテリアル間のスムーズな移行。

事前にベイク済みの巨大なテクスチャを使用するだけですか?既存のテクスチャをタイル表示できるのに、これは非常に非効率的だと思われます。それでは、既存のテクスチャごとに巨大なアルファ マップを使用するのでしょうか?理論的には問題ないように思えますが、実際にどのように実行すればよいのでしょうか?また、その結果はどうなるのでしょうか?どこから始めればよいのかまったくわかりませんし、Google 検索もあまり効果的ではありません。

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

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

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

また、このことについては Game Programming Gems の本の 1 冊で読んだ気がしますが、当時はあまり注目していませんでした。そして今は夏なので、大学の図書館にアクセスして調べることができません。今目次を探しているので見つかったら編集しますが、まだ8月中旬までは読めません。

編集:ああ、ゲーム プログラミング Gems 7 には、「屋外の地形レンダリングのための大きなテクスチャのマッピング」というタイトルの第 5.8 章があり、まさに私が必要としているもののように思えますが、私の大学の図書館にはその本さえありません。他の Game Programming Gems の本にはこれとまったく同じようなものは見つかりませんでしたが、いくつかの本には地形ジオメトリの記事がありました。

役に立ちましたか?

解決

私は最近、あなたが話していることと同様のことを行う小さな地形レンダリングエンジンを OpenGL で作成しました。私が使用しているテクニックは、次のように説明するのが最適です。 テクスチャの飛び散り.

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

ミックスマップ

このミックスマップは、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);
}

均一テクスチャスケールは、詳細テクスチャが地形全体に何回タイル表示されるかを決定する値です。値を高くすると、細部のテクスチャがより鮮明に見えますが、繰り返しが多くなる危険があります。

他のヒント

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

IDがシングルを大きくしたようです 「メガテクスチャ」 (32K^2-128K^2 について話しています) QuakeWars で動作します。

これについては Carmack との興味深い Q&A があります。

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

(元のリンクは現在無効になっているようですが、SO には Internet Archive リンクに問題があるようですので、上記のリンクは作成されていません。編集プレビューではうまく表示されますが、メイン ページでは壊れます)。

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

3 つ以上のマテリアルが必要な場合は、異なるテクスチャを使用して異なるディスプレイスメントをテクスチャリングすることでシミュレーションする必要があり、個々のタイルには最大でも 2 つのマテリアルのみが含まれるようにします。

ピクセルごとではなく頂点ごとにアルファを持たせると、見た目がかなり悪くなります。Oblivion で指摘したように、たとえば丸石が砂に滑らかに溶け込んでいます。この欠陥には修正があります。ピクセルごとにアルファを調整する別のテクスチャを使用すると、丸石の間の亀裂がすぐに砂で埋まりますが、丸石の上部は、補間された頂点アルファが丸石のほぼ 0 になるまで、ほぼ 1.0 アルファのままになります。材料。これにより、トランジションが単なる醜い汚れではなく、非常に美しく見えるようになります。

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

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

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

アルファ テクスチャと同じテクスチャ座標を持つベース テクスチャを使用します。ベーステクスチャは何でも構いません。衛星写真や草のテクスチャなど。地面の形状に関連していれば完璧に一致します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top