問題タブ [dds-format]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Direct2D (SharpDX) ブロックで圧縮されたビットマップがメモリ内で圧縮されていない
私はいくつか (8-10) の大きなテクスチャ アトラス (BC1 DDS として保存された約 8192x8192) を持っていますが、それらはかなり小さいディスク容量であり、わずか 32MiB です。
問題は、WIC を使用してこれらのファイルをロードすると、ブロック圧縮が失われ、最大 256MiB の RAM が消費されることです。
ファイルをロードする私のC#SharpDXコードは次のとおりです。
何かを変更する必要がありますか、それとも WIC とは別のロード方法を使用する必要がありますか?
私はDdsFrameDecode.CopyBlocks (+ ID2D1Bitmap::CopyFromMemory ) メソッドを見ましたが、それがどのように機能するのかわかりません.. (正確には私のストライドとは何か、どこからその情報を取得しますか)
編集:
したがって、BitmapFrameDecode は 32bppPBGRA の PixelFormat を提供します
その BitmapFrameDecode から DDSFrameDecode をクエリすると、DdsFrameDecode から BC1_UNorm の形式が取得されます。DdsDecoder は、DdsAlphaModePremultiplied のテクスチャと、BC1_UNorm の DxgiFormat もレポートします。
しかし、BitmapProperties で BC1_UNorm のピクセル形式を強制すると、D2D DEBUG エラーが発生します。「この API に渡されたピクセル形式は、IWICBitmapSource のピクセル形式と互換性がありません」
EDIT2: CopyBlocks の使用方法を理解しました
しかし、問題はまだ存在します。ビットマップを正常に作成できますが、それでも大量のメモリを消費します (実際のブロック圧縮サイズの 32MiB ではなく 250MiB+)。
のレンダーターゲットと関係があるのでしょうか?ソフトウェア B8G8R8A8_UNorm DeviceContext レンダー ターゲットを使用しています
EDIT3:
サンプル プロジェクト: https://drive.google.com/file/d/1hCgQnEV9xcTevgdswAiPJNREk1oDgqDC/view?usp=sharing