gpt4 book ai didi

c++ - 如何从 .fxo 文件创建 ID3D11VertexShader?

转载 作者:行者123 更新时间:2023-11-30 04:03:45 24 4
gpt4 key购买 nike

我有一个没有定义任何技术的 .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。但是,我宁愿不使用 Effect 接口(interface),而且我的 .fx 文件中也没有任何技术。除了从 .fxo 文件而不是 .fx 文件外,是否有任何方法可以像我上面那样加载着色器?

最佳答案

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

关于c++ - 如何从 .fxo 文件创建 ID3D11VertexShader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24212048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com