Загрузка скомпилированных шейдеров HLSL в памяти для использования с CreatePixelShader
Мне нужно загрузить скомпилированный пиксельный шейдер в память для использования с CreatePixelShader, но я не могу использовать любой вызовы D3DX.
Как я могу это сделать?
(Я использую Visual Studio 2010 в качестве компилятора и C++ в качестве языка)
2 ответов
создайте предварительно скомпилированный шейдер из командной строки с помощью fxc:
fxc filename.hlsl /E PixelShaderEntry /Fo precompiledShader.ext
загрузите предварительно скомпилированные данные шейдера, используя обычный код загрузки файла c++.
в коде psuedo-ish:
byte * data = loadFile("precompiledShader.ext");
IDirect3DPixelShader9 *ps = NULL;
HRESULT hr = device->CreatePixelShader(data, ps);
Я понимаю, что кто-то опубликовал псевдокод ранее. Вот код c++, использующий Windows SDK (а не библиотеки D3DX по запросу).
Здесь "PixelShader.cso " - это предварительно скомпилированный шейдер hlsl, созданный Visual Studio 11 из a .файл hlsl в проекте. Скомпилированный .файл cso обычно перемещается в папку Projects/ProjectName/Debug по умолчанию. В результате перед использованием его необходимо вырезать и вставить в тот же каталог, что и исходный код. Имейте в виду, что эту настройку можно изменить щелкнув правой кнопкой мыши файл HLSL внутри Visual Studio 11 и отредактировав параметры вывода. По умолчанию: $(OutDir)%(Filename).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);
обратите внимание на L перед " PixelShader.ого." Мой проект использовал Многобайтовый набор символов, если у вас установлен Unicode, L может не понадобиться.