2012-10-25 36 views
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錯誤檢查宏。

在此先感謝!

+0

是'data'編譯着色器?否則,你必須先編譯它。 –

+0

是的,它是由VS2012創建的Compiled Shader Object(AFAIK它使用fxc.exe)。 – Drop

回答

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

恥辱= \