我有一个结构如下;
struct LIBRARY_EXPORT gpuprogram_t {
public:
GLuint gpuprogram_handle;
gpuprogram_t();
~gpuprogram_t();
void attach_shader(GLuint shader_handle, GLuint shader_type);
void link_program();
void use_program();
void add_attribute(const std::string& attribute);
void add_uniform(const std::string& uniform);
GLuint operator[](const std::string& attribute);
GLuint operator()(const std::string& uniform);
private:
std::map<GLuint, GLuint> shaders;
std::map<std::string, GLuint> attribute_list;
std::map<std::string, GLuint> uniform_list;
};
我用它来管理一些OpenGL。我在.cpp文件中实现了这些东西。在我的attach_shader实现中有一部分;
if (shaders.find(shader_type) == shaders.end()) {
// No shader of this type is attached before
shaders.insert(std::pair<GLuint, GLuint>(shader_type, shader_handle));
...
}
我的构造函数也是这样;
gpuprogram_t::gpuprogram_t() {
gpuprogram_handle = glCreateProgram();
}
如果您想自己构建MCVE,可以将其中的其他部分留空并使用它;
gpuprogram_t gp;
gp.attach_shader(shader_handle, shader_type)
在这里你不必拥有OpenGL的GLuints,你可以将它们改为普通的int。 这部分每次都给我分段故障。我不知道地图着色器有什么问题。我没有在构造函数中初始化它。我将它保存在头文件中,以便使用默认构造函数初始化它。然后我将通过attach_shader填写它。稍后当程序对象超出范围时,将删除所有对象。但显然我做错了什么。着色器映射可能总是垃圾,每次都会导致分段错误。我做错了什么?