无法以面向对象的方式包装OpenGL

时间:2015-10-01 21:54:56

标签: c++ opengl graphics

我对OpenGL库不太熟悉,所以我无法理解为什么当我将一些初始化代码移动到类或函数时,GL会停止绘制到屏幕上。一些研究表明,图书馆是“全球的”或基于国家的,而不是基于对象的?

无论如何,这里有一些代码有效

GLuint vertexArrayBuffer;
glGenVertexArrays(1, &vertexArrayBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexArrayBuffer);
// VBO is ready to accept vertex data
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindVertexArray(0);    
while(!screen.isClosed()) {
    // Give the screen a background color
    screen.paint(0.0f, 0.0f, 0.5f, 1.0f);

    glBindBuffer(GL_ARRAY_BUFFER, vertexArrayBuffer);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDisableVertexAttribArray(0);


    // Switch to display buffer after drawing all of the above   
    screen.swapBuffers();

这全部包含在main函数中,编程结构不多。输出是一个漂亮的白色三角形到蓝色背景上。

这是问题所在,在事件循环之前使用 exact 代码并将其包装到函数中:

GLuint initVertexArray(vertex vertices[]) {
// Create file descriptor for the VBO for use as reference to gl vertex functions
GLuint vertexArrayBuffer;
glGenVertexArrays(1, &vertexArrayBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexArrayBuffer);
// VBO is ready to accept vertex data
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindVertexArray(0);

return vertexArrayBuffer;
}

并在main函数中调用它GLuint vertexArrayBuffer = initVertexArray(vertices);,不产生任何类型的输出,也没有错误,只有相同的蓝色背景。

1 个答案:

答案 0 :(得分:3)

您是否检查过返回的sizeof(顶点)。在这种情况下,vertices []将衰减成指针,所以我想象sizeof(顶点)是sizeof(vertex *)。

尝试将数组的大小与它一起传递:

didSelectItemAtIndexPath

然后你会像这样使用它:

GLuint initVertexArray(vertex vertices[], const unsigned int size);

而不是:

glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_STATIC_DRAW);

然后,您将在声明顶点数组的范围内调用它:

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);