2012-03-16 156 views
0

我已经开始做了一些OpenGL,并且我刚刚发现了固定功能管道的替代方案,所以我去搜索教程。可悲的是,大多数优秀的教程使用C++,如果可能的话,我想坚持使用C语言。所以我无法复制粘贴东西并尝试。OpenGL绘制缓冲区问题

复制粘贴和合并代码给出了错误,但我不知道我应该如何处理它们。有问题的错误是“分段故障”,这里是代码:

#include <GL/glfw.h> 
#include <GL/glu.h> 
#include <stdlib.h> 

#define SCREEN_WIDTH 1600 
#define SCREEN_HEIGHT 1000 

void main(int argc, char **argv) 
{ 
    float mouse_x, mouse_y; 

    GLuint positionBufferObject; 
    const float vertexPositions[] = { 
    0.75f, 0.75f, 0.0f, 1.0f, 
    0.75f, -0.75f, 0.0f, 1.0f, 
    -0.75f, -0.75f, 0.0f, 1.0f, 
}; 
    glGenBuffers(1, &positionBufferObject); 

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    int running = GL_TRUE; 
    // Initialize GLFW 
    if(!glfwInit()) 
    { 
     exit(EXIT_FAILURE); 
    } 

    // Open an OpenGL window 
    if(!glfwOpenWindow(SCREEN_WIDTH,SCREEN_HEIGHT, 8,8,8,8,8,8, GLFW_WINDOW)) 
    { 
     glfwTerminate(); 
     exit(EXIT_FAILURE); 
    } 

    while (running) 
    { 
     glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); 
     glEnableVertexAttribArray(0); 
     glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 

     glDrawArrays(GL_TRIANGLES, 0, 3); 
    } 
} 

当然,大量的代码在这里失踪的,因为它(显然)不影响该错误。 注释掉“glDrawArrays”修复错误,OpenGL正常运行(不绘制任何东西,逻辑上)。

任何帮助?

回答

4

您应该在启动绑定缓冲区等之前初始化gl。初始化过程获取并分配指向这些函数的指针。否则它们是空的。

+0

不是glfwInit初始化OpenGL?我曾尝试过。在这个简短的代码中,它随后崩溃了我的电脑,并在完整的代码中仍然以分段错误结束。 – Orpheon 2012-03-16 13:57:42

+0

那么,显然glfwInit是你需要先做的事情,在其他的东西之前,至少在你给出的代码示例中是错误的。奇怪的是,你说删除DrawArrays修复了错误,当有不少其他函数在之前调用的时候,不应该这样做! – Robinson 2012-03-16 14:05:48

+0

@Orheon:不,“glfwInit”不初始化OpenGL。它初始化GLFW。在你使用OpenGL之前,你必须初始化GLFW *和*打开一个窗口。 – 2012-03-16 17:28:23