2017-04-23 48 views
0

當我嘗試使用CreateVertexShader()創建着色器時,出現COM錯誤「該數據表不正確。」。C++ DirectX 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; 
} 

相同功能的另一個版本,但使用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())); 
} 

回答

0

在創建着色器之前,您需要保持ShaderData::ShaderCode;指向的緩衝區有效。爲了避免泄漏,只需將其替換爲::std::vector<char> ShaderCode;,以便緩衝區保持安全。實際上,您根本不需要ShaderData結構,只需返回包含着色器代碼的向量即可。

+0

現在的作品非常感謝你。 – sorte33