なぜテクスチャは常に2のべき乗を二乗するのですか?そうでない場合はどうなりますか?


53

ゲームのテクスチャの解像度が常に2のべき乗(128x128、256x256、512x512、1024x1024など)なのはなぜですか?ゲームのファイルサイズを節約し、テクスチャをUVラップ解除モデルに正確に合わせるのは賢明ではありませんか?

2のべき乗ではないテクスチャがあった場合はどうなりますか?

テクスチャを256x512または512x1024のようなものにするのは間違っていますか?または、これにより、2のべき乗以外のテクスチャが引き起こす問題が発生しますか?


9
他の例も2のべき乗であり、同じ2のべき乗ではありません。2の累乗により、テクスチャはグラフィックハードウェアに最適化されます。
マイケルハウス

1
@ Byte56彼は2 ^ nx 2 ^ nテクスチャを意味すると思います。nは1から無限まで変化します。(実際には無限ではありません。)
ロビン

また、2の累乗にはミップマップを簡単にする利点があることに注意してください。
パブ

テクスチャは通常ラップするので(カスタムシェーダーでこれを選択できますが)、スペースを浪費する必要はありません。ポリゴンのUV座標をエッジの周りにラップするだけで、利用可能なスペースをより簡単に利用できます。あなたが差し迫った必要性を持っていない場合、幅=高さ= 2 ^ nのテクスチャに固執するのが最も安全です。これは、より複雑なUVレイアウトを犠牲にしてより幅広いハードウェアを可能にするためです。
ダニエルカールソン

それらは常に 2の累乗ではありません。
アルモ

回答:


49

ゲームのテクスチャの解像度が常に2のべき乗(128x128、256x256、512x512、1024x1024など)なのはなぜですか?

Byte56が暗示するように、サイズ制限「2のべき乗」は、各寸法がテクスチャが方形でなければならないことを、独立に、2の累乗でなければならないこと(た)でありそして 2のべき乗である寸法を有します。

ただし、最新のカードおよび最新のグラフィックスAPIでは、この「制限」は大幅に緩和されており、テクスチャの寸法は、理にかなって、お好きなものにすることができます。しかしながら:

ゲームのファイルサイズを節約し、テクスチャをUVラップ解除モデルに正確に合わせるのは賢明ではありませんか?2のべき乗ではないテクスチャがあった場合はどうなりますか?

テクスチャの次元が2のべき乗であることを確認することにより、グラフィックパイプラインは2のべき乗の処理の効率に関連する最適化を活用できます。たとえば、2の累乗で除算および乗算する速度が速くなります(専用のGPUと非常に巧妙な最適化コンパイラが登場するまでに数年前に遡ります)。ミップマップの計算や使用など、パイプライン内の2のべき乗での操作も簡素化されます(2のべき乗の数は常に半分に均等に分割されるため、丸める必要があるシナリオに対処する必要はありませんミップマップの寸法を上下に調整します)

この方法でスペースを「浪費」するのは確かですが、通常、レンダリングパフォーマンスのトレードオフのために余分なスペースが必要です。さらに、複数の画像を単一のテクスチャ空間に圧縮またはパックするなどのテクニックがあり、ストレージの無駄を軽減できます。


11
「この方法でいくつかのスペースを「無駄にする」のは事実ですが、通常、余分なスペースはレンダリングパフォーマンスのトレードオフのために価値があります。」-約10年前、PS2ゲームをXBoxに移植するスタジオで働いていました。PS2は技術的に2のべき乗以外のテクスチャをサポートしていませんが、場合によっては、少し巧妙な操作と速度損失なしで、強制的にそうすることができます。一方、XBoxはそれらを完全にサポートしていませんでした。最終結果は、XBoxがPS2のほぼ2倍のRAMを搭載しているにもかかわらず、適合するためにテクスチャの一部をダウンサンプリングする必要があったことです。
-ZorbaTHut

引用を見つけるのに苦労していますが、以前はJPEG画像は8の倍数である必要があることを読んでいます。
サーモンムース

1
@salmonmoose:正しい。JPEGは、8x8の各ブロックを個別に圧縮し、エッジにブロックを埋め込みます。しかし、それはこの質問とは無関係です。
–MSalters

1
JPEGは8x8ブロックでエンコードされます、はい。ただし、これは実際には効率の考慮事項ではありません。また、必ずしも2の累乗でもありません。:)
キロタン

例はAndroid上にあり、poweroftwoでないテクスチャの多くは白いテクスチャになります。
-user717572

17

なぜテクスチャは常に2のべき乗を二乗するのですか?

テクスチャは必ずしも 正方形ではなく、常に 2のべき乗でもありません。それら 2のべき乗になる傾向がある理由は、通常、その制限を課した古いビデオカードとの互換性を高めるためです。非正方形のテクスチャに関しては、通常は問題ではありません。要約する:

  • 通常、テクスチャは正方形である必要はありません-DirectXにはD3DPTEXTURECAPS_SQUAREONLY機能がありますが、古いハードウェアでも問題なく正方形以外のテクスチャを使用しました。
  • 多くの古いグラフィックカードテクスチャを必要とするためテクスチャは2のべき乗でなければなりません。その制限の理由は、テクスチャマッピング操作に対していくつかの最適化を実行できるようにするためでした。最新のグラフィックカードのほとんどにもこの制限はありません。

12
「古いグラフィックカード」とは、2006年以前に作成されたものを意味することに注意してください。
ニコルボーラス

1
@NicolBolasありがたいことに、私は実際にその点に関する参考文献を見つけようとしていました。
デヴィッドゴーベイア

7

グラフィックカードの最適化に関連しています。それらはそのように処理するように設計されています。最近のほとんどのカードでは、2のべき乗ではない寸法のテクスチャを読み込むことできますが、パフォーマンスに悪影響を与える可能性があります。ロード時に実際に変換される可能性が高く、ロードに時間がかかり、メモリを節約できません。正方形でないテクスチャは、両方の寸法が2のべき乗である限り、通常は問題ありません。

奇数サイズのテクスチャを扱う1つの方法は、テクスチャアトラスを使用することです。基本的に、複数のテクスチャを1つのテクスチャにまとめ、頂点のテクスチャ座標を使用して、必要な特定の画像を参照します。これには、状態の変更を回避できるため、パフォーマンス上の利点も追加されます。これの一般的な使用法は、インターフェイスのすべての要素を単一のテクスチャに配置することです。つまり、インターフェイスの頂点を単一のバッファオブジェクトにまとめた場合、テクスチャを切り替えるのではなく、1回の呼び出しで全体を描画できます何回も、それぞれに対して個別に描画呼び出しを行います。


6

問題は、ハードウェアによっては、2次元のパワーを持たないテクスチャのサポートが制限されていることです。

たとえば、http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspxの下部を見て、そこで脚注3と4を読んでください

3機能レベル9_1、9_2、および9_3では、ディスプレイデバイスは、2つの条件下で2のべき乗ではない寸法の2Dテクスチャの使用をサポートします。まず、各テクスチャに対して1つのMIPマップレベルしか作成できません。2番目に、テクスチャのラップサンプラーモードは許可されません(つまり、D3D11_SAMPLER_DESCのAddressU、AddressV、およびAddressWメンバーをD3D11_TEXTURE_ADDRESS_WRAPに設定することはできません)。

4機能レベル10_0、10_1、および11_0では、ディスプレイデバイスは、2の累乗ではない次元を持つ2Dテクスチャの使用を無条件にサポートします。


6

グラフィックスハードウェアは、行列演算、フラグメント演算、ベクトル演算向けに最適化されています。単純に正方行列を置くと、ブロック(フラグメントと呼ばれる)で計算が行われるため、ハードウェアがブロック操作用に最適化され、ファイルバッファーのようなものがあり、RAMブリットはブロックになるまでディスクにブリットされません。移入されました。グラフィックメモリについても同じことが言えます。

フレームバッファは、正方形のフラグメントで構成されています。たとえば、解像度800x600およびRGBカラースペース(0-255)の画面では、各チャネルに3バイトの800x600ポイントがあり、フレームバッファーのアドレスには合計3x800x600 = 1,440,000バイトがあります。つまり、256x256x3バイトの1,875個のアドレス可能なフラグメントがあります。テクスチャデータは正方形であるため、バイキュービックスケーリングを使用してGRAMマトリックスからスクリーンバッファーマトリックスにマップすることが非常に簡単になります。正方形ではない場合、長辺のバイアスは必要なときに計算に時間がかかります。スケーリングされます。

多くのグラフィックスAPIは、UVマッピング座標を浮動小数点データとして受け入れるため、非正方形のテクスチャデータを受け入れますが、GPUに送信されると、画像の実際の比率がマッピングを変更しないため、パディングがテクスチャデータに追加されますGPUは影響を受けないように見えますが、テクスチャデータにパディングが追加されます。これは、GPUが完全な正方形としてアドレス指定することを好むためです。

したがって、100x1024の画像が使用され、1024x1024の画像が使用される場合、946,176バイトが無駄になります。合成を行う場合は、パディングデータが合成テクスチャに影響を与えないことを示すためにアルファチャネルを追加する必要があるため、さらにそうなります。


これは、通常の2のべき乗(+1)には見られない興味深い説明(正方行列に関するtitbit)です。可能であれば、引用を提供してもらえますか?
サマウルサ

1

私たちのデジタル世界は、2進法で動作し、値を左または右に「移動」できる値をマルチプレイまたは2で除算します。

<<  Left shift      x = 5 << 1    0101 << 1     1010     10
>>  Right shift     x = 5 >> 1    0101 >> 1     0010      2

CPUでは、「2のべき乗」の値を使用する方が簡単です。


0

現代のハードウェアは、(最終的に)しかし、2つのテクスチャのノンパワーまだ彼らが埋め取得する傾向があるとして、GPUのメモリを無駄にする傾向があり、2つのベースのテクスチャのノンパワーにラップモードを有効に対応できる幅に沿っていずれかのいくつかのハードウェアの特定の量(でテクスチャを含む次の2のべき乗のサイズに切り上げられます。

これはハードウェアに依存しているため、ベンダーは一般にこれらの詳細の詳細には触れないため、GPU ramを無駄にしないために、テクスチャの2次元のパワーを引き続き使用することが最も安全です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.