C++ 取消映射缓冲区glBindBuffer()时出现分段错误

C++ 取消映射缓冲区glBindBuffer()时出现分段错误,c++,qt,opengl,C++,Qt,Opengl,在()上也有类似的帖子,但它没有解决我的问题 当我调用下面的glBingBuffer(),第二个参数为0以解除缓冲区的绑定时,程序会发生故障。如果我取消这些行的注释,那么程序将正常运行。为什么会这样 QtRenderer::QtRenderer() : QGLWidget(){ } QtRenderer::~QtRenderer() { } void QtRenderer::initializeGL() { makeCurrent(); const char* vertexSo

在()上也有类似的帖子,但它没有解决我的问题

当我调用下面的
glBingBuffer()
,第二个参数为0以解除缓冲区的绑定时,程序会发生故障。如果我取消这些行的注释,那么程序将正常运行。为什么会这样

QtRenderer::QtRenderer() :
  QGLWidget(){
}

QtRenderer::~QtRenderer() {
}

void QtRenderer::initializeGL() {
  makeCurrent();

  const char* vertexSource =
    "#version 150\n"
    "in vec2 position;"
    "void main() {"
    "   gl_Position = vec4( position, 0.0, 1.0 );"
    "}";
  const char* fragmentSource =
    "#version 150\n"
    "out vec4 outColor;"
    "void main() {"
    "   outColor = vec4( 1.0, 1.0, 1.0, 1.0 );"
    "}";

  glextensions_loader::load_gl_extensions();

  glGenBuffers( 1, &vbo );

  float vertices[] = {
    0.0f, 0.5f,
    0.5f, -0.5f,
    -0.5f, -0.5f
  };

  glBindBuffer( GL_ARRAY_BUFFER, vbo );
  glBufferData( GL_ARRAY_BUFFER, sizeof( vertices ), vertices, GL_STATIC_DRAW );
  glBindBuffer( GL_ARRAY_BUFFER, 0 ); // <-----------SEGFAULT

  // Create and compile the vertex shader
  GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
  glShaderSource( vertexShader, 1, &vertexSource, NULL );
  glCompileShader( vertexShader );

  // Create and compile the fragment shader
  GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
  glShaderSource( fragmentShader, 1, &fragmentSource, NULL );
  glCompileShader( fragmentShader );

  // Link the vertex and fragment shader into a shader program
  GLuint shaderProgram = glCreateProgram();
  glAttachShader( shaderProgram, vertexShader );
  glAttachShader( shaderProgram, fragmentShader );
  //glBindFragDataLocation( shaderProgram, 0, "outColor" );
  glLinkProgram( shaderProgram );
  glUseProgram( shaderProgram );

  GLint posAttrib = glGetAttribLocation( shaderProgram, "position" );
  glEnableVertexAttribArray( posAttrib );
  glVertexAttribPointer( posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0 );
}

void QtRenderer::paintGL() {
  makeCurrent();

  // Clear the screen to black
  glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
  glClear( GL_COLOR_BUFFER_BIT );

  // Draw a triangle from the 3 vertices
  glBindBuffer( GL_ARRAY_BUFFER, vbo );
  glDrawArrays( GL_TRIANGLES, 0, 3 );
  glBindBuffer( GL_ARRAY_BUFFER, 0 );  // <-----------SEGFAULT
}

void QtRenderer::updateGL() {
  paintGL();
}
QtRenderer::QtRenderer():
QGLWidget(){
}
QtRenderer::~QtRenderer(){
}
void QtRenderer::initializeGL(){
makeCurrent();
常量字符*顶点源=
“#版本150\n”
“处于vec2位置;”
“void main(){”
“gl_位置=向量4(位置,0.0,1.0);”
"}";
常量字符*碎片源=
“#版本150\n”
“out vec4 OUTCLOR;”
“void main(){”
outColor=vec4(1.0,1.0,1.0,1.0)
"}";
glextensions_loader::load_gl_extensions();
glGenBuffers(1,&vbo);
浮动顶点[]={
0.0f,0.5f,
0.5f,-0.5f,
-0.5f,-0.5f
};
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态图);
glBindBuffer(GL_ARRAY_BUFFER,0);//答案来自:

映射缓冲区时,您可以自由解除绑定缓冲区。但是, 您不能调用任何会导致OpenGL读取、修改、, 或者在映射时写入该缓冲区 glBufferData​ 与使用任何会导致OpenGL的函数一样,都是out 从中读取(使用VAO进行渲染等)

因此,必须对代码进行必要的更改

void QtRenderer::initializeGL() {
  makeCurrent();

  const char* vertexSource =
    "#version 150\n"
    "in vec2 position;"
    "void main() {"
    "   gl_Position = vec4( position, 0.0, 1.0 );"
    "}";
  const char* fragmentSource =
    "#version 150\n"
    "out vec4 outColor;"
    "void main() {"
    "   outColor = vec4( 1.0, 1.0, 1.0, 1.0 );"
    "}";

  glextensions_loader::load_gl_extensions();

  glGenBuffers( 1, &vbo );

  float vertices[] = {
    0.0f, 0.5f,
    0.5f, -0.5f,
    -0.5f, -0.5f
  };

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

  // Create and compile the vertex shader
  GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
  glShaderSource( vertexShader, 1, &vertexSource, NULL );
  glCompileShader( vertexShader );

  // Create and compile the fragment shader
  GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
  glShaderSource( fragmentShader, 1, &fragmentSource, NULL );
  glCompileShader( fragmentShader );

  // Link the vertex and fragment shader into a shader program
  GLuint shaderProgram = glCreateProgram();
  glAttachShader( shaderProgram, vertexShader );
  glAttachShader( shaderProgram, fragmentShader );
  //glBindFragDataLocation( shaderProgram, 0, "outColor" );
  glLinkProgram( shaderProgram );
  glUseProgram( shaderProgram );

  GLint posAttrib = glGetAttribLocation( shaderProgram, "position" );
  glEnableVertexAttribArray( posAttrib );
  glVertexAttribPointer( posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0 );

  glBindBuffer( GL_ARRAY_BUFFER, 0 ); // <-----------NO SEGFAULT
}

void QtRenderer::paintGL() {
  makeCurrent();

  // Clear the screen to black
  glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
  glClear( GL_COLOR_BUFFER_BIT );

  // Draw a triangle from the 3 vertices
  glBindBuffer( GL_ARRAY_BUFFER, vbo );
  glDrawArrays( GL_TRIANGLES, 0, 3 );
  glBindBuffer( GL_ARRAY_BUFFER, 0 ); // <-----------NO SEGFAULT
}
void QtRenderer::initializeGL(){
makeCurrent();
常量字符*顶点源=
“#版本150\n”
“处于vec2位置;”
“void main(){”
“gl_位置=向量4(位置,0.0,1.0);”
"}";
常量字符*碎片源=
“#版本150\n”
“out vec4 OUTCLOR;”
“void main(){”
outColor=vec4(1.0,1.0,1.0,1.0)
"}";
glextensions_loader::load_gl_extensions();
glGenBuffers(1,&vbo);
浮动顶点[]={
0.0f,0.5f,
0.5f,-0.5f,
-0.5f,-0.5f
};
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态图);
//创建并编译顶点着色器
GLuint vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(顶点着色器,1和顶点源,NULL);
glCompileShader(顶点着色器);
//创建并编译片段着色器
GLuint fragmentShader=glCreateShader(GL\u fragmentShader);
glShaderSource(fragmentShader,1和fragmentSource,NULL);
glCompileShader(fragmentShader);
//将顶点和片段着色器链接到着色器程序中
GLuint shaderProgram=glCreateProgram();
glAttachShader(着色器程序、顶点着色器);
glAttachShader(着色器程序、碎片着色器);
//glBindFragDataLocation(着色器程序,0,“outColor”);
GLLINK程序(着色器程序);
glUseProgram(shaderProgram);
GLint posAttrib=glGetAttribLocation(着色器程序,“位置”);
glEnableVertexAttribArray(posAttrib);
glvertexattributepointer(posAttrib,2,GL_FLOAT,GL_FALSE,0,0);
glBindBuffer(GL_ARRAY_BUFFER,0);//答案来自:

映射缓冲区时,您可以自由解除绑定缓冲区。但是, 您不能调用任何会导致OpenGL读取、修改、, 或者在映射时写入该缓冲区 glBufferData​ 与使用任何会导致OpenGL的函数一样,都是out 从中读取(使用VAO进行渲染等)

因此,必须对代码进行必要的更改

void QtRenderer::initializeGL() {
  makeCurrent();

  const char* vertexSource =
    "#version 150\n"
    "in vec2 position;"
    "void main() {"
    "   gl_Position = vec4( position, 0.0, 1.0 );"
    "}";
  const char* fragmentSource =
    "#version 150\n"
    "out vec4 outColor;"
    "void main() {"
    "   outColor = vec4( 1.0, 1.0, 1.0, 1.0 );"
    "}";

  glextensions_loader::load_gl_extensions();

  glGenBuffers( 1, &vbo );

  float vertices[] = {
    0.0f, 0.5f,
    0.5f, -0.5f,
    -0.5f, -0.5f
  };

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

  // Create and compile the vertex shader
  GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
  glShaderSource( vertexShader, 1, &vertexSource, NULL );
  glCompileShader( vertexShader );

  // Create and compile the fragment shader
  GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
  glShaderSource( fragmentShader, 1, &fragmentSource, NULL );
  glCompileShader( fragmentShader );

  // Link the vertex and fragment shader into a shader program
  GLuint shaderProgram = glCreateProgram();
  glAttachShader( shaderProgram, vertexShader );
  glAttachShader( shaderProgram, fragmentShader );
  //glBindFragDataLocation( shaderProgram, 0, "outColor" );
  glLinkProgram( shaderProgram );
  glUseProgram( shaderProgram );

  GLint posAttrib = glGetAttribLocation( shaderProgram, "position" );
  glEnableVertexAttribArray( posAttrib );
  glVertexAttribPointer( posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0 );

  glBindBuffer( GL_ARRAY_BUFFER, 0 ); // <-----------NO SEGFAULT
}

void QtRenderer::paintGL() {
  makeCurrent();

  // Clear the screen to black
  glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
  glClear( GL_COLOR_BUFFER_BIT );

  // Draw a triangle from the 3 vertices
  glBindBuffer( GL_ARRAY_BUFFER, vbo );
  glDrawArrays( GL_TRIANGLES, 0, 3 );
  glBindBuffer( GL_ARRAY_BUFFER, 0 ); // <-----------NO SEGFAULT
}
void QtRenderer::initializeGL(){
makeCurrent();
常量字符*顶点源=
“#版本150\n”
“处于vec2位置;”
“void main(){”
“gl_位置=向量4(位置,0.0,1.0);”
"}";
常量字符*碎片源=
“#版本150\n”
“out vec4 OUTCLOR;”
“void main(){”
outColor=vec4(1.0,1.0,1.0,1.0)
"}";
glextensions_loader::load_gl_extensions();
glGenBuffers(1,&vbo);
浮动顶点[]={
0.0f,0.5f,
0.5f,-0.5f,
-0.5f,-0.5f
};
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态图);
//创建并编译顶点着色器
GLuint vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(顶点着色器,1和顶点源,NULL);
glCompileShader(顶点着色器);
//创建并编译片段着色器
GLuint fragmentShader=glCreateShader(GL\u fragmentShader);
glShaderSource(fragmentShader,1和fragmentSource,NULL);
glCompileShader(fragmentShader);
//将顶点和片段着色器链接到着色器程序中
GLuint shaderProgram=glCreateProgram();
glAttachShader(着色器程序、顶点着色器);
glAttachShader(着色器程序、碎片着色器);
//glBindFragDataLocation(着色器程序,0,“outColor”);
GLLINK程序(着色器程序);
glUseProgram(shaderProgram);
GLint posAttrib=glGetAttribLocation(着色器程序,“位置”);
glEnableVertexAttribArray(posAttrib);
glvertexattributepointer(posAttrib,2,GL_FLOAT,GL_FALSE,0,0);

glBindBuffer(GL_数组_缓冲区,0);//看看,将堆栈跟踪上传到问题中可能会很有用。使用“-g”标志编译文件,然后在gdb下运行程序。当seg.fault发生时,执行
bt
并发布回溯跟踪。这将有助于回溯跟踪相当于“where”命令的输出。它似乎在驱动程序中崩溃t是从nvidia的网站上安装的。这与Qt没有什么关系,除非您使用的是Qt GL便利包装(QOpenGLBuffer、QOpenGLShaderProgram等):-)我知道微软一直在推动他们的Bing搜索引擎,甚至试图像谷歌一样使用Bing,但它真的在OpenGL中获得了吸引力吗?看看吧,上传问题的堆栈跟踪可能会有用。用“-g”标志编译文件,然后在gdb下运行程序。当出现seg.fault时,执行
bt