OpenGL VAO,VBO,EBO访问

时间:2016-05-14 09:11:45

标签: opengl access-violation vbo vao

我有以下用于加载模型的代码(这里是一个三角形)并将其加载到我的资源管理器中:

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

0 个答案:

没有答案