C++ DirectX CreateVertexShader COM 错误
C++ DirectX CreateVertexShader COM error
当我尝试使用 CreateVertexShader() 创建我的着色器时,出现 COM 错误 'The paremeter is incorrect.'。
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都是classShader的成员变量,保存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()));
}
在创建着色器之前,您需要保持 ShaderData::ShaderCode;
指向的缓冲区有效。为避免泄漏,只需将其替换为 ::std::vector< char > ShaderCode;
即可确保缓冲区安全。实际上你根本不需要 ShaderData
结构,只需要 return 一个包含着色器代码的向量。
当我尝试使用 CreateVertexShader() 创建我的着色器时,出现 COM 错误 'The paremeter is incorrect.'。
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都是classShader的成员变量,保存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()));
}
在创建着色器之前,您需要保持 ShaderData::ShaderCode;
指向的缓冲区有效。为避免泄漏,只需将其替换为 ::std::vector< char > ShaderCode;
即可确保缓冲区安全。实际上你根本不需要 ShaderData
结构,只需要 return 一个包含着色器代码的向量。