2

行ごとに三角形のストリップでレンダリングされたハイトマップを完成させました。私の解決策は次のとおりです。

height=data[k];
coords.push_back((float)col);
coords.push_back((float)(height/heightscale));
coords.push_back((float)row);
k+=3; //red is enough, im using greyscale

およびストリップのインデックス:

for(int row=0;row<infoheader.biHeight-1;row++)
   {
    for(int col=0;col<infoheader.biWidth;col++)
    {
        indexes.push_back((row+1)*infoheader.biWidth+col);
        indexes.push_back(row*infoheader.biWidth+col);
    }
   }

行ごとのループで VertexArrayObject と drawelements を使用します。今、私は高さに基づいて単一のシェーダーの色付けでそれを使用していますが、テクスチャと組み合わせたいです(高さに基づいていますが、それでも私の問題ではありません)

四角形を形成する2つの三角形にテクスチャを配置したいのですが、

0,1-1,1     
 |  /|
 | / |
 |/  |
0,0-1,0

...しかし、実装方法が本当にわかりません。これに関するすべてのトピックを読みましたが、機能しませんでした(単色のみが表示されるか、マップ全体が黒でした)。

では、最初の「クワッド」(2 つの三角形) のみの配列を作成し、インデックスを増やすなどして、それに基づいてマップ全体をテクスチャリングすることは可能ですか? はいの場合、どうすればこれを行うことができますか。もう 1 つ: マップ全体の上に 1 つのテクスチャを配置して、地形全体にスケーリングするにはどうすればよいでしょうか。

1 つのクワッドまたは 2 つの三角形を含む三角形ストリップでそれらを行うことができましたが、〜 3 000 000 の三角形ではできませんでした。

主な問題はインデックス付けです。私が正しければ、インデックスに基づいて頂点の位置だけでなく、色とテクスチャ座標も描画するからです。

私の地図: http://kepfeltoltes.hu/view/130827/1094341850Untitled_www.kepfeltoltes.hu_.png 私はそれがかなり「過大な」質問であることを知っていますが、まだ正しい方法を見つけていません。編集:テクスチャを並べて表示したい。

4

1 に答える 1

1

メッシュとテクスチャについて、次の仮定を行います (これは緩和することができますが、私のドリフトを得ることができます)。

  • どちらも正方形です
  • x と z のメッシュの範囲は 0 から TERRAIN_WIDTH までです (これは正の整数です)。

上記の仮定が成り立つ場合、テクスチャはテレイン メッシュの頂点を座標化します。

v = (v_x, v_y, v_z)

は単に

texcoord = (v_x / TERRAIN_WIDTH, v_z / TERRAIN_WIDTH)

この texcoord はフラグメント シェーダーに渡され、テクスチャ ルックアップに使用されます。この texcoord は、const 値または均一値を使用して、頂点シェーダー内で直接生成できます。

uniform float TERRAIN_WIDTH; // or a less flexible const float TERRAIN_WIDTH;
uniform mat4  ModelViewProjection;

in  vec4 Position; // x and z assumed to be in 0 .. TERRAIN_WIDTH (inclusive)

out vec2 TexCoord;

void main()
{
    TexCoord    = Position.xz / TERRAIN_WIDTH:
    gl_Position = ModelViewProjection * Position;
}

警告: テストされていないコード!

編集:タイリングに関して:上記はまだ保持されます。ただし、TERRAIN_WIDTH は TILE_WIDTH などに置き換える必要があります。私はまだ全体的に正方形のメッシュと正方形のタイルを想定しています。

たとえば、地形の寸法が 256x256 で、寸法が 128x128 の 4 つのタイルで構成されている場合、(240, 0, 240) の頂点の texcoords は次のように計算されます。

texcoord = (240 / タイル幅、240 / タイル幅) = (240 / 128、240 / 128) = (1.875、1.875)

TEXTURE_WRAP_S および TEXTURE_WRAP_T モード (デフォルト) として GL_REPEAT を使用すると、整数部分 (つまり 1) は単純に無視され、結果の texcoord は (0.875, 0.875) になります。

ご覧のとおり、これも [0, 1] にあり、(112, 0, 112) と同じ (240, 0, 240) のテクセルを検索します。したがって、同じテクスチャを使用してタイリング効果を得ることができます。

: タイリングを視覚的に機能させるには、テクスチャもタイリングする必要があります。そうしないと、錯覚が継ぎ目で文字通り破裂します。;)

于 2013-08-27T14:47:21.973 に答える