从内存创建着色器时出错

时间:2012-10-25 13:53:40

标签: c++ directx shader hlsl

由于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错误检查宏。

提前致谢!

1 个答案:

答案 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(); 

我很遗憾= \