directx SDK の fxc.exe ユーティリティを使用してシェーダーをコンパイルし、アプリケーションにバイト配列としてロードしています (このコードを使用):
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]
この行をもう一度コメントすると、すべてが機能します。私がそれらを変更する場合(1で0のインデックス)、すべてが機能します。私が見る唯一の違い-コンパイルされたファイルのサイズ(両方の行で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 機能レベルを使用しています。