0

環境:
i5 750
DDR3 4G Win7 pro x64 sp1
DXSDK 9.0c 2010 年 6 月
GeForce GT240(ドライバー 275.33) 512MB
MSVC 2008 sp1

プロジェクト:
DXT5(A8R8G8B8) dds 形式のキャラクター スプライト イメージを使用するゲーム プロジェクト。
スプライトは各フレームあたり 512*512 サイズで、各フレームは相互ファイルです。
(レンダリングされた 3dsmax カートゥーン シェーダー モデリング アニメーションを使用し、3dsmax は各フレームを他のファイルにレンダリングします)
、そのようにロードし ます。

HRESULT hr = D3DXCreateTextureFromFileEx( m_pd3dDevice //LPDIRECT3DDEVICE9 m_pd3dDevice
        ,filename_upper.c_str() //std::wstring filename_upper
        ,D3DX_DEFAULT_NONPOW2   
        ,D3DX_DEFAULT_NONPOW2   
        ,1
        ,0
        ,D3DFMT_A8R8G8B8
        ,D3DPOOL_MANAGED
        ,D3DX_FILTER_NONE 
        ,D3DX_FILTER_NONE
        ,NULL
        ,&info   // D3DXIMAGE_INFO info                
        ,NULL
        ,&rsTexture //LPDIRECT3DTEXTURE9 rsTexture
);

問題: hr
はほぼS_OKです。多くのファイルが読み込まれると、D3DXERR_INVALIDDATAが出力されることがあります。 私はグーグルで調べていましたが、メモリ不足ではないことがわかりました。(メモリ不足はD3DERR_OUTOFVIDEOMEMORYまたはE_OUTOFMEMORYです) 多くの回答は「ファイルが破損しているか、異常にフォーマットされています」と言っていますが、ランダムファイルのロードでエラーが発生するため、そうは思いません。(「ロードに失敗したファイル」は、次回は正常にロードされるか、その逆のケースがランダムにロードされます)。

何が問題で、どうすればよいですか?
本当にパニックです助けて!

4

1 に答える 1

2

あなたの答えを説明する:

D3DFMT_A8R8G8B8 は D3DFMT_DXT5 ではありません。フォーマットの名前は、それぞれが 8 ビットの 4 つのコンポーネントを含むことを意味しているため、「R8」などです。したがって、すべてのファイルを 32 ビットに変換すると、DXT5 の 4 倍のストレージ スペースが必要になります。

単純に D3DFMT_FROM_FILE を使用すると、ファイルで指定した DXT5 を使用することになります。D3DFMT_DXT5 を指定することもできます。これには、たまたまロードした R8G8B8A8 (またはその他の形式) ファイルを正しい DXT5 圧縮形式に自動的に変換できるという利点があります。

于 2012-08-12T08:21:14.757 に答える