0


OpenTK を使用して C# で小さな OpenGL タイル マップ レンダラーを作成しています。タイルをレンダリングするには、まず頂点配列を作成し、次に頂点バッファーを作成します。
次に、すべてのタイルを反復処理し、タイル タイプに応じて、2 つの三角形を頂点バッファーに追加し、対応する頂点 (テクスチャの座標、色、位置) を指定します。
テクスチャの高価な切り替えを避けるために、テクスチャ アトラスという名前のすべてのタイル テクスチャで 1 つの大きなテクスチャを使用します。
しかし、テクスチャ アトラスの操作中に問題が発生しました。
問題は、ズームアウトしてカメラを移動すると、一部のタイルの端にアーティファクトが発生することです。
インターネットで見つけた解決策は...

  1. ...ハーフ ピクセル補正を使用してテクスチャ座標を計算します。
  2. ...テクスチャ配列を使用するには

私が最初に試したものですが、期待どおりに機能しませんでした(詳細は以下で説明します)。
2 つ目は、テクスチャ配列の操作方法がわからず、インターネット上でテクスチャ配列についてあまり見つけることができませんでした。

次のテクスチャ フィルタを使用しました。

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);

ハーフ ピクセル補正を使用したテクスチャ座標の計算:

text_coord_x = (0.5f + pixel_x) / texture_width;
text_coord_y = (0.5f + pixel_x) / texture_height;

ハーフ ピクセル補正なしのテクスチャ座標計算:

text_coord_x = pixel_x / texture_width;
text_coord_y = pixel_y / texture_height;

ハーフ ピクセル補正を使用した1 つのタイル:
ハーフ ピクセル補正を使用した 1 つのタイル

ハーフ ピクセル補正なしの1 つのタイル:
ハーフ ピクセル補正なしの 1 つのタイル

ハーフ ピクセル補正を使用した複数のタイル:
ハーフ ピクセル補正を使用した複数のタイル

ハーフ ピクセル補正なしの複数のタイル:
ハーフ ピクセル補正なしの複数のタイル

4

1 に答える 1

1

アトラスの境界線に関する問題を解決するには、各スプライトの周囲に N ピクセルの境界線を残す必要があります。この境界線には、必要なタイリングに応じたピクセル情報が含まれている必要があります。この境界線は、ロット 3D プログラムによって生成される場合があります。

たとえば、Blender はマージン オプションを使用して複数のテクスチャを 1 つに焼き付けることができます。

ここに画像の説明を入力

また、N ピクセルの幅は、将来のアトラスのミップ レベルに依存します。したがって、1 ピクセルの境界線を追加する場合は、単一のミップ レベル (ゼロ ミップ レベル) のみを使用できます。2 つの場合 - 0 ミップと 1 ミップ レベルなどを使用できます。ミップ レベルが境界線の幅よりも大きくないことを確認してください。

于 2015-10-23T20:41:32.927 に答える