C++ 从内存创建着色器时出错
由于C++ 从内存创建着色器时出错,c++,directx,shader,hlsl,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[si
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
大小相同的缓冲区,其大小等于.cso
文件大小。
我知道,MSDN上有新的Windows8示例,但它们使用了一些新的Metro内容。我想用普通的C++来做。
XTRACE2
只是DirectX错误检查宏
提前谢谢 错误是在文本模式下读取二进制文件引起的。如果在读取函数中添加二进制标志,则可以正常工作。诸如此类:
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();
羞耻于我=\数据是编译后的着色器吗?否则,您必须先编译它。是的,它是由VS2012创建的已编译着色器对象(AFAIK它使用fxc.exe)。