ゲームのテクスチャの解像度が常に2のべき乗(128x128、256x256、512x512、1024x1024など)なのはなぜですか?ゲームのファイルサイズを節約し、テクスチャをUVラップ解除モデルに正確に合わせるのは賢明ではありませんか?
2のべき乗ではないテクスチャがあった場合はどうなりますか?
テクスチャを256x512または512x1024のようなものにするのは間違っていますか?または、これにより、2のべき乗以外のテクスチャが引き起こす問題が発生しますか?
ゲームのテクスチャの解像度が常に2のべき乗(128x128、256x256、512x512、1024x1024など)なのはなぜですか?ゲームのファイルサイズを節約し、テクスチャをUVラップ解除モデルに正確に合わせるのは賢明ではありませんか?
2のべき乗ではないテクスチャがあった場合はどうなりますか?
テクスチャを256x512または512x1024のようなものにするのは間違っていますか?または、これにより、2のべき乗以外のテクスチャが引き起こす問題が発生しますか?
回答:
ゲームのテクスチャの解像度が常に2のべき乗(128x128、256x256、512x512、1024x1024など)なのはなぜですか?
Byte56が暗示するように、サイズ制限「2のべき乗」は、各寸法がテクスチャが方形でなければならないことを、独立に、2の累乗でなければならないこと(た)でありそして 2のべき乗である寸法を有します。
ただし、最新のカードおよび最新のグラフィックスAPIでは、この「制限」は大幅に緩和されており、テクスチャの寸法は、理にかなって、お好きなものにすることができます。しかしながら:
ゲームのファイルサイズを節約し、テクスチャをUVラップ解除モデルに正確に合わせるのは賢明ではありませんか?2のべき乗ではないテクスチャがあった場合はどうなりますか?
テクスチャの次元が2のべき乗であることを確認することにより、グラフィックパイプラインは2のべき乗の処理の効率に関連する最適化を活用できます。たとえば、2の累乗で除算および乗算する速度が速くなります(専用のGPUと非常に巧妙な最適化コンパイラが登場するまでに数年前に遡ります)。ミップマップの計算や使用など、パイプライン内の2のべき乗での操作も簡素化されます(2のべき乗の数は常に半分に均等に分割されるため、丸める必要があるシナリオに対処する必要はありませんミップマップの寸法を上下に調整します)
この方法でスペースを「浪費」するのは確かですが、通常、レンダリングパフォーマンスのトレードオフのために余分なスペースが必要です。さらに、複数の画像を単一のテクスチャ空間に圧縮またはパックするなどのテクニックがあり、ストレージの無駄を軽減できます。
なぜテクスチャは常に2のべき乗を二乗するのですか?
テクスチャは必ずしも 正方形ではなく、常に 2のべき乗でもありません。それらが 2のべき乗になる傾向がある理由は、通常、その制限を課した古いビデオカードとの互換性を高めるためです。非正方形のテクスチャに関しては、通常は問題ではありません。要約する:
D3DPTEXTURECAPS_SQUAREONLY
機能がありますが、古いハードウェアでも問題なく正方形以外のテクスチャを使用しました。グラフィックカードの最適化に関連しています。それらはそのように処理するように設計されています。最近のほとんどのカードでは、2のべき乗ではない寸法のテクスチャを読み込むことができますが、パフォーマンスに悪影響を与える可能性があります。ロード時に実際に変換される可能性が高く、ロードに時間がかかり、メモリを節約できません。正方形でないテクスチャは、両方の寸法が2のべき乗である限り、通常は問題ありません。
奇数サイズのテクスチャを扱う1つの方法は、テクスチャアトラスを使用することです。基本的に、複数のテクスチャを1つのテクスチャにまとめ、頂点のテクスチャ座標を使用して、必要な特定の画像を参照します。これには、状態の変更を回避できるため、パフォーマンス上の利点も追加されます。これの一般的な使用法は、インターフェイスのすべての要素を単一のテクスチャに配置することです。つまり、インターフェイスの頂点を単一のバッファオブジェクトにまとめた場合、テクスチャを切り替えるのではなく、1回の呼び出しで全体を描画できます何回も、それぞれに対して個別に描画呼び出しを行います。
問題は、ハードウェアによっては、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テクスチャの使用を無条件にサポートします。
グラフィックスハードウェアは、行列演算、フラグメント演算、ベクトル演算向けに最適化されています。単純に正方行列を置くと、ブロック(フラグメントと呼ばれる)で計算が行われるため、ハードウェアがブロック操作用に最適化され、ファイルバッファーのようなものがあり、RAMブリットはブロックになるまでディスクにブリットされません。移入されました。グラフィックメモリについても同じことが言えます。
フレームバッファは、正方形のフラグメントで構成されています。たとえば、解像度800x600およびRGBカラースペース(0-255)の画面では、各チャネルに3バイトの800x600ポイントがあり、フレームバッファーのアドレスには合計3x800x600 = 1,440,000バイトがあります。つまり、256x256x3バイトの1,875個のアドレス可能なフラグメントがあります。テクスチャデータは正方形であるため、バイキュービックスケーリングを使用してGRAMマトリックスからスクリーンバッファーマトリックスにマップすることが非常に簡単になります。正方形ではない場合、長辺のバイアスは必要なときに計算に時間がかかります。スケーリングされます。
多くのグラフィックスAPIは、UVマッピング座標を浮動小数点データとして受け入れるため、非正方形のテクスチャデータを受け入れますが、GPUに送信されると、画像の実際の比率がマッピングを変更しないため、パディングがテクスチャデータに追加されますGPUは影響を受けないように見えますが、テクスチャデータにパディングが追加されます。これは、GPUが完全な正方形としてアドレス指定することを好むためです。
したがって、100x1024の画像が使用され、1024x1024の画像が使用される場合、946,176バイトが無駄になります。合成を行う場合は、パディングデータが合成テクスチャに影響を与えないことを示すためにアルファチャネルを追加する必要があるため、さらにそうなります。