OpenGL分割故障

OpenGL Segmentation Fault

本文关键字:故障 分割 OpenGL      更新时间:2023-10-16

我遵循OpenGL编程指南:第8版,我有点卡在第一章(triangle .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调试非常陌生。我看到过很多关于分割错误的问题。有一个人和我有同样的问题,但不幸的是,他删除了这个问题。

我真的不觉得这是一个重复,因为我并没有真正理解我读过的大多数关于同一主题的答案。请让答案尽可能简单。

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

编辑:确切的错误发生在

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

分段错误发生在使用GL的第一个命令中,因此,我确保导入freeglut,它也包含了opengl所需的所有库。

#include freeglut

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