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 回答