如何从.fxo文件创建ID3D11VertexShader

How to create ID3D11VertexShader from .fxo file?

本文关键字:文件创建 ID3D11VertexShader fxo      更新时间:2023-10-16

我有一个没有定义任何技术的.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文件外,是否有任何方法可以像我上面那样加载着色器?

由于编译的shader只是准备上传的大量二进制数据,任何文件加载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);
 }