Загрузка предварительно скомпилированного шейдера HLSL в память для использования с CreatePixelShader - PullRequest
9 голосов
/ 16 февраля 2011

Мне нужно загрузить скомпилированный пиксельный шейдер в память для использования с CreatePixelShader, но я не могу использовать любые вызовы D3DX.

Как я могу это сделать?

(я использую Visual Studio 2010 в качестве компилятора и C ++ в качестве языка)

Ответы [ 2 ]

20 голосов
/ 25 мая 2012

Я понимаю, что кто-то выложил псевдокод ранее. Вот код C ++, использующий Windows SDK (а не библиотеки D3DX, как было запрошено).

Здесь "PixelShader.cso" - это предварительно скомпилированный шейдер hlsl, сгенерированный Visual Studio 11 из файла .hlsl в проекте. Скомпилированный файл .cso обычно по умолчанию перемещается в папку Projects / ProjectName / Debug. В результате он должен быть вырезан и вставлен в тот же каталог, что и ваш исходный код перед использованием. Помните, что этот параметр можно изменить, щелкнув правой кнопкой мыши файл HLSL в Visual Studio 11 и изменив параметры вывода. По умолчанию его: $ (OutDir)% (имя файла) .cso, измените его на: $ (Directory)% (имя файла) .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.cso". В моем проекте использовался многобайтовый набор символов, если у вас установлено Unicode, L может не понадобиться.

5 голосов
/ 16 февраля 2011

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