我遇到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));
它完美无缺。
为什么不能完全上传纹理?
答案 0 :(得分:2)
打开文件时,需要指定文件是二进制文件:
std::ifstream file( fileName, std::ios::in | std::ios::binary );
没有std::ios::binary
标志,默认情况下你是以纯文本阅读,这不是D3DX11CreateShaderResourceViewFromMemory所期望的。