如何从.fxo文件创建ID3D11VertexShader?

时间:2014-06-13 18:47:34

标签: c++ shader directx-11

我有一个没有任何技术定义的.fx文件。在我的代码中,要加载我的顶点和像素着色器,我使用

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。但是,我不想使用效果界面,无论如何我的.fx文件中没有技术。有没有办法像上面那样加载着色器,除了.fxo文件而不是.fx文件?

1 个答案:

答案 0 :(得分: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);
 }