テクスチャアトラスとアレイテクスチャ:CPUとGPUによる処理の違いと、パフォーマンスへの影響


10

Unity 5.4(現在ベータ版)は、配列テクスチャ-OpenGLのArrayTextureと同じ無駄に待望の機能(2013年以降)をもたらします。ただし、配列-テクスチャーとテクスチャーアトラスについて少し読んだ後でも、CPUとGPUによるそれらの使用法の技術的な違いを完全には理解できません。

具体的には、CPUとGPUがテクスチャアトラスとテクスチャ配列を処理する方法の主な違いと、最も重要なのは、そのような違いがパフォーマンスとメモリの処理にどのように影響するか(例:テクスチャ配列がテクスチャアトラスよりもパフォーマンスを向上させる方法など)。

Unityの実装に関する技術的な詳細が、残念ながらクローズドソースであるために欠けている場合は、OpenGL.s ArrayTextureに関する回答で十分満足しています。


どちらも実装に依存しているため(配列の場合はさらに)、技術的な比較が見つからなかったのも当然です。
ワンドラ2016年

Unityエンジンは内部がどのように機能するかについての情報を取得するのに苦労するでしょう。これは、クローズドソースのブラックボックスだからです。あなたができる唯一のことは、それぞれのケースをプロファイリングして、CPUとGPUの使用状況を比較することです。それがどのように機能するかを理解するには、Unityエンジニアが介入するか、そのソースコードを開くかリークする必要があります。
jgallant

@ジョンフェアは十分ですが、実際にはエンジンにとらわれない答えの方が興味がありました。それだけ変化する場合は、質問を更新して、たとえばOpenGLのArrayTextureについて話すことができます。opengl.org/ wiki
ASteer

回答:


11

上記のコメントで述べたように、パフォーマンスは実装、特定のハードウェア、およびテクスチャで何をしようとしているかに依存するため、信頼できる唯一の答えは、それぞれの選択肢をプロファイルすることです。

ただし、各オプションの使用方法にはいくつかの違いがありますが、これは一貫して適用されます。

1つの大きな違いは、配列テクスチャの場合、テクスチャ座標のラップやミップマッピングなどの目的で、各テクスチャが個別に処理されることです。

これにより、特に深いミップレベルでサンプルの端が混ざり合うのを防ぐために、隣接するテクスチャ見本の間にパディングを追加する必要があるテクスチャアトラスの一般的な問題が回避されます。

これは、テクスチャをタイリングしたい場合、テクスチャサンプリングハードウェアを使用して、バニラテクスチャと同じように行うことができることも意味します。アトラを使用すると、通常、フラグメントシェーダーでタイリング計算を行う必要があります。サンプラーは、アトラス全体のテクスチャ座標をラップ/ミラー/クランプ/ボーダーするだけで、内部の個々のタイルはラップしないためです。

配列テクスチャの主な制限は、すべての構成テクスチャが同じ解像度とミップレベル数を持つ必要があることです。解像度のニーズが非常に異なるテクスチャをバッチでまとめようとしている場合(たとえば、距離とともにLoDが低下するテレインタイルを仮想テクスチャ格納する場合)、代わりにアトラスの柔軟性が必要になる場合があります。


ありがとう、それがまさに私が求めていたものでした。つまり、どちらがより高速でメモリ集約型であるかについての正確な回答ではありません。もちろん、これらは実装に依存しているためです。それでも、各ケースの機能に関するいくつかの指針が、通常の最適なシナリオと最悪のシナリオを理解するのに役立つと確信しました。あなたの答えは確かに私に役立ちました。
ASteer

配列テクスチャのもう1つの欠点:によって制限されGL_MAX_ARRAY_TEXTURE_LAYERSます。私の半近代的なGPUでは、これは2048なので、大量の小さなテクスチャが必要な場合は、この制限が低すぎる可能性があります。
JWD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.