我真的有两个问题。
第一个是对事件的描述:软件使用DirectX 9并在启动时从资源编译着色器。当您从IDE中运行软件时,着色器可以使用调试版和发行版进行编译,但是当您双击它以独立运行它时,您开始从D3DXCompileShader获得许多奇怪的错误。
我已经说明了Visual Studio将着色器文本文件转换为Unicode并且以某种方式抛出D3DXCompileShader的可能性。当我在IDE中而不是在IDE之外时,为什么他们编译并运行正常是一个谜(注意,如果你在VS之外启动它然后将调试器附加到进程,它仍然会失败)。有人对此有什么想法吗?
我的第二个问题涉及到解决上述问题的尝试。我没有使用自己的资源数据类型SHADER,而是将着色器导入为RCDATA,因此我现在无需手动从资源中加载着色器文本,而是可以使用D3DXCompileShaderFromResource。然而,从我对此的调用中我得到了一个糟糕的HRESULT,但是`errors'集合仍然是空的。根本没有调试输出。代码如下所示:
HRESULT result;
result = D3DXCompileShaderFromResource( 0,
MAKEINTRESOURCE(IDR_SHADERPHONG),
NULL,
NULL,
"VERTEXMAIN",
D3DXGetVertexShaderProfile(Window()->GetDevice()),
D3DXSHADER_OPTIMIZATION_LEVEL3,
&MyVertexShaderBuffer,
&errors,
&MyVertexShaderConstants);
HRESULT是-2005529767,似乎“失败”。我没有找到关于它与D3DXCompileShaderFromResource相关的内容的参考资料!
我希望我在stackoverflow的聪明朋友可以在这里提供一些帮助:p。感谢。
答案 0 :(得分:0)
好的,问题是由同事发现的。在加载我的资源时,我抓住了一个内存块并错误地将其转换为std :: string。也就是说,std :: string将通过资源查找null终止符,但资源数据不一定有一个(它只是一个文本文件)。它最终会找到一个,但是,可能在内存的某些部分,该软件不应该使用!
因此,要将char缓冲区从资源转换为std :: string,应使用以下内容:
return std::string(reinterpret_cast<char const*>(pD), bytes);
不是这个:
return std::string(pD);
,除非您确定pD指向以空值终止的字符串。