我需要将一个已编译的像素着色器加载到内存中以与CreatePixelShader一起使用,但我不能使用任何 D3DX调用.
我怎样才能做到这一点?
(我使用Visual Studio 2010作为编译器,使用C++作为语言)
小智 20
我意识到有人早先发布了伪代码.这是使用Windows SDK的C++代码(而不是所请求的D3DX库).
这里"PixelShader.cso"是Visual Studio 11从项目中的.hlsl文件生成的预编译hlsl着色器.编译后的.cso文件通常默认移动到Projects/ProjectName/Debug文件夹.因此,在使用之前必须将其剪切并粘贴到与源代码相同的目录中.请注意,可以通过在Visual Studio 11中右键单击HLSL文件并编辑"输出设置"来更改此设置.默认情况下:$(OutDir)%(文件名).cso,将其更改为:$(目录)%(文件名).cso
ID3D11PixelShader* PS;
ID3DBlob* PS_Buffer;
D3DReadFileToBlob(L"PixelShader.cso", &PS_Buffer);
d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS);
d3d11DevCon->PSSetShader(PS, 0, 0);
Run Code Online (Sandbox Code Playgroud)
在"PixelShader.cso"之前记下L.我的项目使用的是多字节字符集,如果您将其设置为Unicode,则可能不需要L.
使用fxc从命令行构建预编译着色器:
fxc filename.hlsl /E PixelShaderEntry /Fo precompiledShader.ext
Run Code Online (Sandbox Code Playgroud)
使用常规c ++文件加载代码加载预编译的着色器数据.
在psuedo-ish代码中:
byte * data = loadFile("precompiledShader.ext");
IDirect3DPixelShader9 *ps = NULL;
HRESULT hr = device->CreatePixelShader(data, ps);
Run Code Online (Sandbox Code Playgroud)