2014-06-13 38 views
1

我有一個沒有任何技術定義的.fx文件。在我的代碼,加載我的頂點和像素着色我用如何從.fxo文件創建ID3D11VertexShader?

ID3DBlob* pVSBlob = NULL; 
ID3DBlob* pErrorBlob; 
    hr = D3DX11CompileFromFile("shader.fx", NULL, NULL, "VS", "vs_4_0", 
     dwShaderFlags, 0, NULL, &pVSBlob, &pErrorBlob, NULL); 

然後進行着色器

hr = g_pd3dDevice->CreateVertexShader(pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), NULL, &g_pVertexShader); 

這種運作良好,而當談到時間來渲染,我只是用

g_pImmediateContext->VSSetShader(g_pVertexShader, NULL, 0); 
g_pImmediateContext->PSSetShader(g_pPixelShader, NULL, 0); 

設置着色器。我想將.fx文件編譯爲一個.fxo文件,但我看到加載.fxo文件的唯一方法是使用D3DX11CreateEffectFromMemory。但是,我不想使用Effect接口,而且我的.fx文件中也沒有技術。除了.fxo文件而不是.fx文件外,是否有像上面那樣加載着色器的方法?

+1

如果您不想要或不需要特效,可能更容易將着色器放入HLSL文件中。 –

回答

2

由於編譯的着色器只是大量準備上傳的二進制數據,所以任何文件加載API都可以。

HANDLE hFile = CreateFile(shaderFileName, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

if (hFile == INVALID_HANDLE_VALUE) 
{ 
    //Error opening file, handle here (GetLastError can return why this failed). 
} 
else 
{ 
    int fileSize = GetFileSize(hFile,NULL); 

    byte* data = (byte*)malloc(fileSize); 
    //You can also check if data is NULL, hence malloc failed 

    DWORD numRead = 0; 

    if (ReadFile(hFile, data, fileSize, &numRead , NULL)) 
    { 
     hr = g_pd3dDevice->CreateVertexShader(data,fileSize,NULL,&g_pVertexShader); 
    } 
    else 
    { 
     //Read failed, handle error as you wish 
    } 

    CloseHandle(hFile); 
    free(data); 
} 
+2

+1但是,如果您打算玩原始指針,請考慮簡單的舊'malloc' /'free'用於POD數據。當沒有構造函數/析構函數參與時,沒有必要在這裏使用'new'。甚至可以使用'HeapAlloc','HeapFree'來保持特定的Windows。在嘗試推送着色器之前,請確保'ReadFile()'成功。 #nitpicky – CodeAngry

+1

好的只是簡單的例子,無論如何增加了錯誤處理(技術上也應該檢查CreateFile的結果)。關於malloc/free,這也可以,所以更新也是如此。 – catflier