2017-12-07 15 views
0

2Dテクスチャには2つの座標xとyがあります。 2D配列を1Dメモリに格納するには、[x + y * width]と[x * height + y]の2つの形式があります。 OpenGLには、さまざまな混乱しやすい行メジャー/列メジャーの規則があります。したがって、2つのフォーマットのどちらが使用されているのかはわかりません。これは、スプライトシートやアトラスなどの複数の画像を格納するためにテクスチャを使用する場合、画像の各部分をメモリ内に近接して配置する方がよいため、これは重要です。たとえば、フォーマットが[x + y *幅]であり、非常に広いテクスチャを使用している場合、GPUは必要なテクセルを見つけるためにメモリの長い部分をスキップする必要があります。OpenGLの高さのテクスチャとメモリの局所性のための広いテクスチャ

したがって、ワイドテクスチャアトラスよりも優れたアトラスアトラスですか、それとも逆ですか?あるいは、GPUにメモリローカリティのメリットがないのですか?

+2

"* OpenGLにはさまざまな混乱しやすい行メジャー/列メジャー規則がありますので、2つのフォーマットのどちらが使用されているのかはわかりません。* 1)マトリックスストレージはテクスチャストレージとは関係ありません。 2)OpenGLには1つの行列規約しかありません。 3)特に混乱はない。 –

答えて

2

テクスチャアトラスの最も重要な側面は、その中にいくつの画像が収まるかということです。テクスチャのテクスチャについても、離れたテクスチャよりも隣接するテクセルにアクセスする可能性が高くなります。

考えてみてください。 2 32x32スプライトをレンダリングするとします。つまり、1回のレンダリング呼び出しで2つのクワッドになります。各クワッドは画面上で32×32ピクセルを占めます。それは1024ピクセルです。

地域性; 1024個の局所的に隣接するテクセルからレンダリングしてから、1024個のローカルに隣接するテクセルの異なるセットからレンダリングします。

いずれにしても、OpenGLはGPUの画像フォーマットの詳細にあなたを晒すことはありません。特定のサイズのテクセルと複数のチャネルを求めることができます。しかし、それ以上の詳細は得られません。提供するデータは、ドライバによって実際の内部GPUデータに適切に変換されます。

通常、GPUはメモリ内のテクスチャを振る舞います。これは、局所性が保存されるようにデータを並べ替えることを意味します。つまり、テクセルをx + y * widthまたはx * height + yのいずれかとして格納する代わりに、それらはより複雑な配列で格納されます。

たとえば、最初の4つの値はテクセル0,0です。 0,1; 1,0; 1,1。したがって、テクセルの2x2ブロックは、連続した1つのメモリ配列に格納されます。これは、スウィズルされたテクスチャストレージの動作の一例です。

これはすべて実装の詳細です。これに影響を与えたり影響を与えることはできません.Vulkanのような低レベルのAPIでさえ、事前にスウィズルされたテクセルデータを直接読み込むことはできません。

関連する問題