Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;DirectX CreateVertexShader COM错误_C++_Directx - Fatal编程技术网

C++ C++;DirectX CreateVertexShader COM错误

C++ C++;DirectX CreateVertexShader COM错误,c++,directx,C++,Directx,当我尝试使用CreateVertexShader()创建着色器时,会出现COM错误“参数不正确” struct ShaderData { LPVOID ShaderCode; size_t ShaderSize; }; 此功能可以工作,但会泄漏。当删除[]缓冲区未注释时,我得到错误 Shader::ShaderData Shader::LoadShader(const std::string& file) { std::ifstream ifs(file, st

当我尝试使用CreateVertexShader()创建着色器时,会出现COM错误“参数不正确”

struct ShaderData
{
    LPVOID ShaderCode;
    size_t ShaderSize;
};
此功能可以工作,但会泄漏。当删除[]缓冲区未注释时,我得到错误

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

您需要保持由
ShaderData::ShaderCode指向的缓冲区在创建着色器之前有效。为了避免泄漏,只需将其替换为
::std::vectorShaderCode这样缓冲区将保持安全。实际上,您根本不需要
ShaderData
struct,只需返回包含着色器代码的向量即可

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