Почему D3DX11CreateShaderResourceViewFromMemory загружает только частичную копию моей текстуры? - PullRequest
1 голос
/ 03 марта 2011

У меня проблема с вспомогательной функцией 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));

, он прекрасно работает.

Есть идеи, почему он не загрузит текстуру полностью?

1 Ответ

2 голосов
/ 27 декабря 2011

При открытии файла необходимо указать, что файл является двоичным:

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

Без флага std::ios::binary, который вы читаете в виде обычного текста по умолчанию, это не то, что ожидает D3DX11CreateShaderResourceViewFromMemory.

...