我有以下用于加载模型的代码(这里是一个三角形)并将其加载到我的资源管理器中:
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f, // Left
0.5f, -0.5f, 0.0f, // Right
0.0f, 0.5f, 0.0f // Top
};
GLuint indices[] = {
0, 1, 2
};
ModelGroup* newGroup = new ModelGroup;
GLuint VBO;
glGenVertexArrays(1, &newGroup->vao);
glGenBuffers(1, &VBO);
glGenBuffers(1, &newGroup->ebo);
glBindVertexArray(newGroup->vao);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newGroup->ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
newGroup->vbos.push_back(VBO);
vertexCount = 3;
indiciesCount = 3;
modelGroups.insert(std::pair<GLchar*, ModelGroup*>("default", newGroup));
以及以下代码来渲染我的三角形:
GLuint vao = model->getVAO();
GLuint count = model->getIndicesCount();
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, NULL);
glBindVertexArray(0);
此代码不起作用并引发访问错误。 我不知道为什么......但事情就是这样 如果我改为将load-code写入我的resourcemanager,则将相同的triangle-load-code写入它工作的renderer-class的构造函数中。我错了什么?
PS:如果我使用来自resourcemanager的加载三角形并将相同的加载代码写入renderer-class-constructor中,它也可以工作......这很奇怪
编辑:我认为我发现了一些错误......一些vbo-,vao-,eboIDs只能在资源管理器中访问,如果我将加载代码写入渲染器的构造函数,他会创建相同的ID(不应该或不应该?) 那与opengl-context有关吗?我该如何解决这个问题?
Edit2:它是相同的opengl-context,但是在resourcemanager-class之外的vao不是vao(用glIsVertexArray检查)。这里有更多关于我的资源管理器的代码,它的结构更加清晰(也更新了上面的代码)。
Edit3:已经犯了一些错误(更新后的代码) 此外,我不能在其他类中渲染三角形,我检查ID等。 所有ID都是正确的。正确创建三角形。但是在任何时候我都尝试访问加载器类之外的vao,它会抛出违例异常。 它让我疯狂......我不知道该怎么做
Edit4:Yaay ......我得到它的工作,它只是指针上的一点点失败,但现在它的工作原理:)
class Model {
public:
struct ModelGroup {
GLuint vao;
GLuint ebo;
std::vector<GLuint> vbos;
};
private:
GLuint vertexCount;
GLuint indiciesCount;
std::map<GLchar*, ModelGroup*> modelGroups;
public:
// all the getters ...
};