OpenGL分段错误

时间:2015-07-29 07:32:08

标签: c++ opengl segmentation-fault

我遵循OpenGL编程指南:第8版,我有点陷入第1章(triangles.cpp)。

我正在运行Ubuntu 14.04.2,这是使用的代码:

// Draws 2 triangles on the screen

#include <iostream>
using namespace std;

#include "vgl.h"
#include "LoadShaders.h"

enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };

GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];

const GLuint NumVertices = 6;

// init

void init(void)
{
    glGenVertexArrays(NumVAOs, VAOs);
    glBindVertexArray(VAOs[Triangles]);

    GLfloat vertices[NumVertices][2] = {
        { -0.90, -0.90 }, //Triangle 1
        {  0.85, -0.90 },
        { -0.90,  0.85 },
        {  0.90, -0.85 }, //Triangle 2
        {  0.90,  0.90 },
        { -0.85,  0.90 }
    };

    glGenBuffers(NumBuffers, Buffers);
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
                 vertices, GL_STATIC_DRAW);

    ShaderInfo shaders[] = {
        { GL_VERTEX_SHADER, "trianges.vert" },
        { GL_FRAGMENT_SHADER, "triangles.frag" },
        { GL_NONE, NULL }
    };

    GLuint program = LoadShaders(shaders);
    glUseProgram(program);

    glVertexAttribPointer(vPosition, 2, GL_FLOAT,
                      GL_FALSE, 0, BUFFER_OFFSET(0));
    glEnableVertexAttribArray(vPosition);
}

// display
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glBindVertexArray(VAOs[Triangles]);
    glDrawArrays(GL_TRIANGLES, 0, NumVertices);

    glFlush();
}

// main
int main (int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitContextVersion(4, 3);
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);

    if (glewInit()) {
        cerr << "Unable to initialize GLEW ... exiting" << '\n';
        exit(EXIT_FAILURE);
    }

    init();

    glutDisplayFunc(display);

    glutMainLoop();
}

此代码编译成功,但在执行时会产生分段错误。

我使用gdb来调试错误。弹出一个随机窗口(仅当我使用gdb时),但它只是显示窗口后面的内容(因此它崩溃了,不会显示两个三角形)。

这是gdb的输出:

Traceback (most recent call last):
  File "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py", line 63, in <module>
from libstdcxx.v6.printers import register_libstdcxx_printers
ImportError: No module named 'libstdcxx'

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()

程序应该在窗口上显示2个三角形。

我对C ++比较陌生,而且我非常擅长将库和调试与gdb连接起来。我在Segmentation Fault上看过很多Q&amp; A.一个人确实遇到了和我一样的问题,但不幸的是,他删除了这个问题。

我并不觉得这是重复的,因为我并没有真正理解我在同一主题上阅读的大部分答案。请尽量简单地回答。

我正在使用freeglut3-dev库,而且我使用的是NVIDIA驱动程序版本346.59。

编辑: 确切的错误发生在

中的init()
glGenVertexArrays(NumVAOs, VAOs);
glBindVertexArray(VAOs[Triangles]);

1 个答案:

答案 0 :(得分:0)

分段错误发生在使用GL的第一个命令处。所以,我确保导入freeglut,其中包括opengl所有必需的库。

#include freeglut

我要感谢Mateusz Grzejek指出这一点。