Загрузка скомпилированных шейдеров 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 может не понадобиться.