2

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

提前致谢!

4

1 回答 1

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

羡慕我=\

于 2012-10-25T22:20:05.773 回答