2013-06-24 59 views
0

所以我有以下代碼:D3DX11CompileFromFile返回S_OK但CreateVertexShader拋出錯誤

extern ID3D11Device* dev; 
    extern ID3D11DeviceContext* devcon;   

    //shaders 
    ID3D10Blob *VS, *PS, *error; 
    HRESULT r; 
    error = 0; 

    r = D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", D3DCOMPILE_DEBUG, 0, 0, &VS, &error, 0); 
    if(FAILED(r)) 
    { 
     LPCWSTR errmsg = (LPCWSTR)error->GetBufferPointer(); 
     MessageBox(hWnd, errmsg, L"error", MB_OK); 
     return; 
    } 

    error = 0; 
    r = D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", D3DCOMPILE_DEBUG, 0, 0, &PS, &error, 0); 
    if(FAILED(r)) 
    { 
     LPCWSTR errmsg = (LPCWSTR)error->GetBufferPointer(); 
     MessageBox(hWnd, errmsg, L"error", MB_OK); 
     return; 
    } 

    // encapsulate both shaders into shader objects 
    r = dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &vertexShader); 
    r = dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pixelShader); 

    devcon->VSSetShader(this->vertexShader, 0, 0); 
    devcon->PSSetShader(this->pixelShader, 0, 0); 

運行代碼,D3DX11CompileFromFile兩個頂點和像素着色器返回S_OK,但是當代碼擊中CreateVertexShader()它拋出一個訪問衝突,爲了我的生活,我無法弄清楚爲什麼。我可能做了一些相當愚蠢的事情,我似乎無法弄清楚。

+0

'dev'非NULL? –

回答

0

嗯,我不是在DirectX的親,但如果我是正確的,一個C++編譯器將在它運行時將.hlsl變成.cso。因此,您應該將D3DX11CompileFromFile參數從L「shaders.hlsl」更改爲L「shaders.cso」,並對另一個函數調用執行相同的操作。

這應該允許程序正確讀取.hlsl文件。

1

這種錯誤的最常見原因是devVS爲空/未初始化。如果訪問衝突發生在0x00000xxx處,那麼它是一個空指針。如果它是0xCCCCCxxx,那麼它是一個未初始化的指針(假設你在Visual Studio下運行)。另外,在分配接口指針(如代碼中的VS和PS)之前以及釋放接口指針之後(並且指針即將超出範圍)是一個很好的做法,因爲這會阻止雙倍釋放指針,並防止指針未被觸發,當指針未正確分配或以某種方式被覆蓋時停止設置爲停止。

相關問題