由于d3dcompiler*.dll
变得不受欢迎,我正试图从我的应用中排除它的依赖关系。我的新编译着色器对象(.cso)文件加载代码有问题。
ifstream fstream;
fstream.open (vsfile);
if(fstream.fail())
return false;
fstream.seekg( 0, ios::end );
size_t size = size_t(fstream.tellg());
char* data = new char[size];
fstream.seekg(0, ios::beg);
fstream.read( data, size);
fstream.close();
XTRACE2(pDevice->CreateVertexShader(&data, size, 0, &m_pVertexShader))
问题:CreateVertexShader()
返回E_INVALIDARG
错误。
D3DReadFileToBlob()
的旧代码运行正常。 Blob返回与我的char*
或std::vector<char>
相同大小的缓冲区,其等于.cso
文件大小。
我知道,MSDN上有新的Windows 8示例,但它们使用了一些新的Metro内容。我想用普通的C ++做。
XTRACE2
只是DirectX错误检查宏。
提前致谢!
答案 0 :(得分:1)
错误是由于在文本模式下读取二进制文件引起的。如果为读取函数添加二进制标志,则按预期工作。这样的事情:
std::ifstream fstream;
fstream.open (filename, std::ifstream::in | std::ifstream::binary);
if(fstream.fail())
return false;
fstream.seekg( 0, std::ios::end );
size_t size = size_t(fstream.tellg());
data.resize(size);
fstream.seekg(0, std::ios::beg);
fstream.read( &data[0], size);
fstream.close();
我很遗憾= \