2017-04-21 82 views
1

如果某些东西不合适,那么第一个问题很抱歉。使用OpenGL制作另​​一个对象

下面是一个工作得很好的代码片段。

初始化函数

ShaderLoader shaderloader; 
    Program = shaderloader.LoadShaders("VertexShader.vs", "FragmentShader.fs"); 
    glGenVertexArrays(1, &VertexArrayObject); 
    glBindVertexArray(VertexArrayObject); 
    glGenBuffers(1, &VertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexBufferData) * 
    vertexBufferData.size(), &vertexBufferData.front(), GL_STATIC_DRAW); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(0); 
    glBindVertexArray(0); 

渲染功能

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glClearColor(0.0, 0.0, 0.0, 1.0); 
glUseProgram(Program); 
glBindVertexArray(VertexArrayObject); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
glBindVertexArray(0); 
glutSwapBuffers(); 

这一切工作我的main.cpp内正常,但当我把这个放到一个类它给了我一个访问冲突错误。我的类容器包含自己的VertexArrayObject和VertexBuffer,所以我假设应该有足够的信息来绘制一个简单的三角形,因为它不在类中时可以很好地绘制。我的最终目标是创建两个对象,所以如果我要完全错误的请指出我的方向正确!

代码在精灵类:

void Mesh::init(std::vector<GLfloat> vertexBufferData) 
    { 
     glGenVertexArrays(1, &VertexArrayObject); 
     glBindVertexArray(VertexArrayObject); 
     glGenBuffers(1, &VertexArrayObject); 
     glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer); 
     glBufferData(GL_ARRAY_BUFFER, sizeof(vertexBufferData) *   
     vertexBufferData.size(), &vertexBufferData.front(), GL_STATIC_DRAW); 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
     glEnableVertexAttribArray(0); 
     glBindVertexArray(0); 
    } 

    void Mesh::Draw() 
    { 
     glBindVertexArray(VertexArrayObject); 
     glDrawArrays(GL_TRIANGLES, 0, 6); 
     glBindVertexArray(0); 
    } 

我如何使用类在main.cpp中:

Mesh object1; 

    void init() 
    { 
     ShaderLoader shaderloader; 
     Program = shaderloader.LoadShaders("VertexShader.vs", "FragmentShader.fs"); 
     object1.init(vertexBufferData); 
    } 

    void Render() 
    { 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glClearColor(0.0, 0.0, 0.0, 1.0); 
     glUseProgram(Program); 
     object1.Draw(); 
     glutSwapBuffers(); 
    } 

而抛出的异常是:0x5253F00A

访问冲突阅读地点

+3

请将错误消息和代码放在实际放入类中的位置。 –

+0

已编辑。对于那个很抱歉! – Vishuu

+0

为什么按值传递顶点缓冲区数据? –

回答

1

您的Mesh类(反对代码在t他顶部)两次写入相同的变量。这是一个简单的错字吗?

glGenVertexArrays(1, &VertexArrayObject); 
glBindVertexArray(VertexArrayObject); 
glGenBuffers(1, &VertexArrayObject); 
       ^^^^^^^^^^^^^^^^^ 
+0

那么怎么样... 你能为我确认一件事吗?当我把它全部放在主体中时,我也犯了这个错误,为什么它在那里工作? – Vishuu

+0

@Vishuu可能是一个巧合。 OpenGL对象的名称通常是随着每个新名称而增加的整数。因此,您在VertexArrayObject/VertexBuffer中最终得到的实际值可能都是1,并且由于某些原因而发生了变化。有很多方法可能导致OpenGL的糟糕用法变坏,或者更糟糕的是,假装工作正常。 –

相关问题