Direct3D 11 CreatePixelShader (E_INVLIDARGS)

3

我正在使用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);
}

问题是,如果我取消注释第二行,那么我将从ID3D11Device :: CreatePixelShader方法获得E_INVALIDARG HRESULT。还会收到来自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特性级别。
1个回答

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接