2017-04-23 33 views
0

CreateVertexShader()でシェーダーを作成しようとすると、COMエラー 'paremeterが正しくありません。'が表示されます。C++ DirectX CreateVertexShader COMエラー

struct ShaderData 
{ 
    LPVOID ShaderCode; 
    size_t ShaderSize; 
}; 

この機能は機能しますが、リークします。 delete [] bufferのコメントが解除されるとエラーが出ます。

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

同じ機能のもう1つのバージョンですが、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は両方ともShaderクラスのメンバ変数であり、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())); 
} 

答えて

0

はあなたがシェーダを作成するまでバッファはShaderData::ShaderCode;有効で指さ維持する必要があります。リークを避けるには、::std::vector<char> ShaderCode;に置き換えてください。バッファは安全に保たれます。実際には、ShaderData構造体はまったく必要なく、シェーダコードを含むベクトルを返すだけです。

+0

これは今、本当にありがとうございます。 – sorte33