我有一个没有任何技术定义的.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文件?
答案 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);
}