2011-05-12 259 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指向一個以空字符結尾的字符串。

相關問題