2

D3DX11CreateShaderResourceViewFromMemoryヘルパー関数に問題があります。

ファイルまたはZIPからテクスチャを読み取り、生のバイトと長さをヘルパー関数に渡しますが、テクスチャの一部のみがアップロードされます(PIXで確認済み)。私は手動で長さをいじってみましたが、役に立ちませんでした。ファイルからテクスチャをロードするコードは次のとおりです。

struct FileDataLoader
{
    void Load()
    {
        std::ifstream file(mFileName);

        if (file)
        {
            file.seekg(0,std::ios::end);
            std::streampos length = file.tellg();
            file.seekg(0,std::ios::beg);

            mBuffer.resize(length);
            file.read(&mBuffer[0],length);
            file.close();
        }
    }

    void Decompress(void*& data, std::size_t& numBytes)
    {
        data = &mBuffer[0];
        numBytes = mBuffer.size();
    }

    std::wstring mFileName;
    std::vector<char> mBuffer;
};

FileDataLoader fdl;
fdl.mFileName = L"Content\\Textures\\Smoke.dds";
fdl.Load();
void* bytes;
std::size_t size;
fdl.Decompress(bytes, size);
DXCall(D3DX11CreateShaderResourceViewFromMemory(device, bytes, size, NULL, NULL, &particleTexture, NULL));

これは、この問題をデバッグするために使用しているサンプルコードにすぎず、ファイルの読み込みとD3DXヘルパー関数に絞り込みました。代わりにこれを行うと:

DXCall(D3DX11CreateShaderResourceViewFromFileW(device, L"Content\\Textures\\Smoke.dds", NULL, NULL, &particleTexture, NULL));

それは完全にうまく機能します。

テクスチャを完全にアップロードしない理由について何か考えはありますか?

4

1 に答える 1

3

ファイルを開くときは、ファイルがバイナリであることを指定する必要があります。

std::ifstream file( fileName, std::ios::in | std::ios::binary );

フラグがないstd::ios::binaryと、デフォルトでプレーンテキストで読んでいますが、これはD3DX11CreateShaderResourceViewFromMemoryが期待するものではありません。

于 2011-12-27T13:44:24.140 に答える