Direct3D 11 CreatePixelShader (E_INVLIDARGS)

Я использую утилиту fxc.exe из DirectX SDK, чтобы скомпилировать мои шейдеры, а затем загрузить их в виде байтового массива в моем приложении (с этим кодом):

inline std::vector<char> ReadToByteArray(char* filename)
{
std::ifstream file;
file.open(filename);
file.seekg(0, std::ios::end);
size_t file_size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<char> data(file_size, 0);
file.read(&data[0], file_size);

return data;
}

И затем создайте это:

std::vector<char> pixelShaderBytecode = ReadToByteArray("myps.pso");
ID3D11PixelShader* shader;
device->CreatePixelShader(pixelShaderBytecode.data(), pixelShaderBytecode.size(), nullptr, &shader);

И все работало хорошо. Пока мой шейдер не вырос до размера ~ 980 байт. Вот мой код в HLSL:

struct PInput
{
float4 position: SV_POSITION;
float3 normal : NORMAL;
};

cbuffer CBuffer
{
float4 color;
float4 dirs[8];
};

float4 main(PInput input) : SV_TARGET
{
// Example code...

int directionLightsCount = 2;

float intensity = 0.0f;

// Line 1
intensity += saturate(dot(input.normal, -dirs[0].xyz));

// Line 2
//intensity += saturate(dot(input.normal, -dirs[1].xyz));

float ambient = 0.1f;

return color * saturate(ambient + intensity);
}

Проблема в том, что если я буду раскомментировать строку 2, то получу E_INVALIDARG HRESULT от ID3D11Device::CreatePixelShader метод. А также предупреждение от уровня отладки D3D11:

D3D11 ERROR: ID3D11Device::CreatePixelShader: Pixel Shader is corrupt or in an unrecognized format. [ STATE_CREATION ERROR #192: CREATEPIXELSHADER_INVALIDSHADERBYTECODE]

Если я снова прокомментирую эту строку, то все будет работать. Если я изменю их (0 индекс с 1), то все будет работать. Единственное отличие, которое я вижу, — размер скомпилированного файла (980 с обеими строками и 916 с только первой строкой)

Вот команда, с помощью которой я компилирую код hlsl:

C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x64>fxc /
T ps_5_0 /E "main" /Fo "ps.pso" ps.ps

В чем причина такого поведения? Я пропустил что-то важное?

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: забыл сказать, что обе версии скомпилированы без каких-либо ошибок. Также вершинный шейдер создан без проблем (1400 байт). Я использую 11_0 уровень возможностей.

3

Решение

Простая ошибка: неправильное чтение файла …

inline std::vector<char> ReadToByteArray(char* filename)
{
std::vector<char> data;
std::ifstream file(filename, std::ios::in | std::ios::binary | std::ios::ate);
data.resize(file.tellg());
file.seekg(0, std::ios::beg);
file.read(&data[0], data.size());
return data;
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]