在Visual Studio外部运行时D3DXCompileShader奇怪的错误

时间:2011-05-12 10:52:42

标签: compilation direct3d shader

我真的有两个问题。

第一个是对事件的描述:软件使用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。感谢。


1 个答案:

答案 0 :(得分:0)

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

因此,要将char缓冲区从资源转换为std :: string,应使用以下内容:

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

不是这个:

return std::string(pD);

,除非您确定pD指向以空值终止的字符串。