C ++ DirectX CreateVertexShader COM错误

时间:2017-04-23 18:28:50

标签: c++ directx

当我尝试使用CreateVertexShader()创建我的着色器时,我收到COM错误'paremeter不正确。'。

struct ShaderData
{
    LPVOID ShaderCode;
    size_t ShaderSize;
};

此功能有效但泄漏。当取消注释delete []缓冲区时,我收到错误。

Shader::ShaderData Shader::LoadShader(const std::string& file)
{
    std::ifstream ifs(file, std::ios::in | std::ios::binary);
    if (!ifs) return;

    ifs.seekg(0, std::ios::end);
    size_t size = static_cast<std::size_t>(ifs.tellg());
    ifs.seekg(0, std::ios::beg);

    char* buffer = new char[size];
    ifs.read(buffer, len);

    ShaderData data = { buffer, size };
    //delete[] buffer;

   return data;
}

同一个函数的另一个版本,但使用std :: vector,我仍然得到同样的错误。

Shader::ShaderData Shader::LoadShader(const std::string& file)
{
    std::ifstream ifs(file, std::ios::in | std::ios::binary);
    if (!ifs) return;

    ifs.seekg(0, std::ios::end);
    size_t size = static_cast<std::size_t>(ifs.tellg());
    ifs.seekg(0, std::ios::beg);

    std::vector<char> buffer(size);

    ifs.read(buffer.data(), size);

    ShaderData data = { static_cast<void*>(buffer.data()), size };

    return data;
}

创建着色器的功能。 m_vertex_data和m_pixel_data都是类Sh​​ader的成员变量,并保存从LoadShader()返回的数据。

void Shader::CreateShaders(ID3D11Device* device)
{
    device->CreateVertexShader(m_vertex_data.ShaderCode,
        m_vertex_data.ShaderSize,
        nullptr,
        m_vertex_shader.GetAddressOf()));

    device->CreatePixelShader(m_pixel_data.ShaderCode,
        m_pixel_data.ShaderSize,
        nullptr,
        m_pixel_shader.GetAddressOf()));
}

1 个答案:

答案 0 :(得分:0)

您需要保持ShaderData::ShaderCode;指向的缓冲区有效,直到您创建着色器。为避免泄漏,只需将其替换为::std::vector< char > ShaderCode;,以便缓冲区保持安全。实际上你根本不需要ShaderData结构,只需返回一个包含着色器代码的向量。