2012-05-25 74 views
2

我想爲我的C++ DirectX 11項目編譯我的項目中的.hlsl文件pre/offline/buildtime。 Visual Studio將.hlsl文件編譯爲.cso文件。我現在無法將SM 5.0的.cso文件讀入我的程序中以創建着色器。如何在Visual Studio 11中使用Shader Model 5.0編譯的着色器?

這裏是我不得不從預編譯.cso文件創建的Pixel Shader代碼:

ID3D11VertexShader* PS; 
ID3DBlob* PS_Buffer; 

D3DReadFileToBlob(L"PixelShader.cso", &PS_Buffer); 
d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS); 
d3d11DevCon->PSSetShader(PS, 0, 0); 

像素着色器僅僅是應該返回藍色像素。它已被編譯爲Shader Model 5.0,通過在Visual Studio 11中更改它的編譯設置。然而,在運行該程序時,儘管它們沒有編譯或運行時錯誤消息,但我試圖渲染的三角形不會顯示出來。

當在運行時使用編譯:

D3DCompileFromFile(L"PixelSHader.hlsl", 0, 0, "main", "ps_5_0", 0, 0, &PS_Buffer, 0); 

代替D3DReadFileToBlob(..),但仍然沒有呈現三角形。

但是,當使用Shader Model 4.0時,無論是編譯時間還是運行時間,都會顯示一個藍色三角形來表示它的工作原理。

這是PixelShader.hlsl文件中的代碼。有沒有可能對Shader Model 5.0來說太過時了,是我問題的根源呢?

float4 main() : SV_TARGET 
{ 
    return float4(0.0f, 0.0f, 1.0f, 1.0f); 
} 

我使用Windows SDK庫而不是2010年6月的DirectX SDK。 我的顯卡是一款nVidia 8800 GTS。

+0

8800GTS僅支持着色器模型4.400系列支持SM5。 –

+0

謝謝你的回答。對於任何希望以任何方式在舊卡上測試SM 5.0的人,嘗試在創建設備和交換鏈時將D3D_DRIVER_TYPE設置爲D3D_DRIVER_TYPE_REFERENCE。但是它會非常慢: 'D3D11CreateDeviceAndSwapChain(NULL,D3D_DRIVER_TYPE_HARDWARE,NULL,NULL,D3D_FEATURE_LEVEL_11_1,1,D3D11_SDK_VERSION,&swapchaindesc,&swapchain_,&device_,NULL,&devicecontext _);'' – gundamb2

回答

2

Shader model 5支持GeForce 400系列,nVidia卡更新,Radeon 5000系列更新,AMD卡更新。您的GeForce 8800僅支持着色器模型4,這就是着色器無法運行的原因。爲了解決這個問題,你可以使用參考設備(通過使用D3D_DRIVER_TYPE_REFERENCE),但這會很慢。此外,如果您有Windows 8預覽(其增加了對D3D_FEATURE_LEVEL_11_0的WARP支持),那麼您可以使用WARP設備,該預覽將比參考設備執行得更好,但仍然無法在硬件設備上運行。