2011-05-12 229 views
-1

我真的有两个问题。D3DXCompile在Visual Studio外运行时出现奇怪的错误

第一个是对事件的更多描述:软件使用DirectX 9并在资源启动时编译着​​色器。当您在IDE中运行软件时,着色器可以很好地进行调试和发布版本的编译,但是当您双击它以独立运行时,您会从D3DXCompileShader中获得许多奇怪的错误。

我已经把它放到了Visual Studio已经将着色器文本文件转换为Unicode的可能性,并且这是以某种方式抛出D3DXCompileShader。为什么他们在IDE中编译并运行正常,但不在它之外是个谜(注意,如果你在VS之外启动它,然后将调试器附加到进程中,它仍然会失败)。任何人对此有任何想法?

我的第二个问题涉及到尝试解决上述问题。我没有使用自己的资源数据类型SHADER,而是将着色器导入为RCDATA,因此我现在无需手动从资源加载着色器文本,而是可以使用D3DXCompileShaderFromResource。然而,我从我的电话中收到了一个不好的HRESULT,但'错误'集合仍然是空的。它根本没有调试输出。代码如下所示:

HRESULT result; 

result = D3DXCompileShaderFromResource(0, 
             MAKEINTRESOURCE(IDR_SHADERPHONG), 
             NULL, 
             NULL, 
             "VERTEXMAIN", 
             D3DXGetVertexShaderProfile(Window()->GetDevice()), 
             D3DXSHADER_OPTIMIZATION_LEVEL3, 
             &MyVertexShaderBuffer, 
             &errors, 
             &MyVertexShaderConstants); 

HRESULT是-2005529767,这似乎是“失败”。我无法找到关于D3DXCompileShaderFromResource相关内容的参考资料!

我希望我的聪明的朋友在stackoverflow可以在这里提供一些援助:页。谢谢。


回答

0

好的,问题被发现(由一位同事)。当加载我的资源时,我正在抓取一个内存块并将其错误地转换为std :: string。也就是说,std :: string将通过资源查找空终止符,但资源数据不一定会有(它只是一个文本文件)。它最终会找到一个,但是,可能在软件不应该使用的部分内存中!

所以,char缓冲区从资源转换成的std :: string时,应使用以下:

return std::string(reinterpret_cast<char const*>(pD), bytes); 

不是这个:

return std::string(pD); 

,当然,除非你知道确定pD指向一个以空字符结尾的字符串。

相关问题