Создание шейдеров DX11 из строки - PullRequest
0 голосов
/ 03 мая 2018

Я не смог ничего найти по этому поводу, и я не уверен, реально ли это выполнимо, но вот так:

Я бы хотел иметь возможность предоставить шейдер для моей игры DX11, которая не загружается из файла (с тех пор этот файл должен был быть включен в проект eeeeevery с использованием моей платформы). Я хочу использовать содержимое файла HLSL напрямую. Я попробовал это, но это вернуло мне E_INVALIDARG.

Вот код:

auto pixelShaderByteCode = std::string("struct PixelShaderInput" \
  "{" \
  "float4 pos : SV_POSITION;" \
  "float3 color : COLOR0;" \
  "};" \
  "float4 main(PixelShaderInput input) : SV_TARGET" \
  "{" \
  "return float4(input.color, 1.0f);" \
  "}");

Microsoft::WRL::ComPtr<ID3D11PixelShader> ps;

auto hr = m_deviceResources->GetD3DDevice()->CreatePixelShader(
  pixelShaderByteCode.c_str(),
  pixelShaderByteCode.length(),
  nullptr,
  &ps);

if (FAILED(hr))
{
    // that did not work... hr = E_INVALIDARG
}

Это тот факт, что мне понадобится скомпилированный шейдер, чтобы это работало? Если это так, что было бы лучше всего для «запекания» шейдеров в движок?

1 Ответ

0 голосов
/ 04 мая 2018

Вы не можете вызвать метод CreatePixelShader с источником HLSL. Вы должны скомпилировать его в двоичный шейдерный блоб first .

Microsoft::WRL::ComPtr<ID3DBlob> blob;
HRESULT hr = D3DCompile(
    pixelShaderByteCode.c_str(),
    pixelShaderByteCode.length(),
    nullptr,
    nullptr,
    nullptr,
    "main", "ps_4_0",
    D3DCOMPILE_ENABLE_STRICTNESS, 0,
    &blob;
    nullptr);
if (FAILED(hr))
    ...

Microsoft::WRL::ComPtr<ID3D11PixelShader> ps;
hr = m_deviceResources->GetD3DDevice()->CreatePixelShader(
    blob.GetBufferPointer(),
    blob.GetBufferSize(),
    nullptr,
    &ps);
if (FAILED(hr))
    ...

Обратите внимание, что лучшим ответом будет компиляция ваших шейдеров в автономном режиме и создание двоичного двоичного объекта в виде массива C в файле заголовка исходного кода C с использованием fxc и параметра /Fh. Затем вы включаете этот заголовок, который напрямую помещает данные шейдера в вашу программу. См. Набор инструментов DirectX , в котором используется этот подход.

...