【问题标题】:Segmentation fault with glBufferData()glBufferData() 的分段错误
【发布时间】:2011-08-14 12:58:47
【问题描述】:

我无法弄清楚为什么这段代码会出现段错误:

AxesMarker::AxesMarker(float size)
    : size_(size), vbo_vertices_(0), vbo_elements_(0)
{
  Vertex vertices[6] = { 
      Vertex(Color4f::RED, Vector3f::ZERO, Vector3f::ZERO),
      Vertex(Color4f::RED, Vector3f::ZERO, Vector3f(size_, 0.0f, 0.0f)),
      Vertex(Color4f::BLUE, Vector3f::ZERO, Vector3f::ZERO),
      Vertex(Color4f::BLUE, Vector3f::ZERO, Vector3f(0.0f, size_, 0.0f)),
      Vertex(Color4f::GREEN, Vector3f::ZERO, Vector3f::ZERO),
      Vertex(Color4f::GREEN, Vector3f::ZERO, Vector3f(0.0f, size_, 0.0f)) };

  GLuint elements[6] = { 0, 1, 2, 3, 4, 5 };

  fprintf(stderr, "sizeof(vertices): %d, sizeof(Vertex): %d", (int) sizeof(vertices), (int) sizeof(Vertex));

  /* create buffers */
  glGenBuffers(1, &vbo_vertices_);
  glGenBuffers(1, &vbo_elements_);

  /* bind buffers */
  glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices_);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_elements_);

  /* buffer data */
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);

  /* unbind buffers */
  glBindBuffer(GL_ARRAY_BUFFER, 0); 
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
}

编译时没有警告,但似乎在第一次调用 glBufferData() 时出现了段错误。 如有必要,我可以发布更多代码,我对 GL 不够熟悉,不知道什么可能相关。 谢谢!


  GLfloat vertices[60] = { 
     1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
     1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
     0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
     0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
     0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
     0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f };

产生相同的段错误。

【问题讨论】:

    标签: c++ opengl segmentation-fault glut


    【解决方案1】:

    您的 Vertex 类是普通的旧数据类型吗?它是否具有任何可能意味着它也具有 vtable 的虚拟功能?您可以尝试使用纯浮点数组重新编写此代码吗(只是为了测试您对 glBufferData 的调用是否有效)。据我所知,您似乎正确使用了 glBufferData,但我可能又错过了一些东西。

    编辑: 在调用此代码之前,您是否绝对确保您的 OpenGL 上下文已完全初始化。这是一个全局对象吗,因为它的构造函数可能在 main 之前被调用?

    【讨论】:

    • 它们都是结构体,我会尝试的。
    • 啊,所以这是实时的。那我最好别再这么努力地帮忙了。 :)
    • 你在使用 Glew 吗?你记得在调用 openGL 之前调用 glewInit 吗?
    • 我没有这样做,但它没有改变任何东西......我只是不明白为什么 glBufferData 正在读取数组末尾。
    • 正如我之前所说,我看不出您调用代码的方式有什么问题。在调用此代码之前,您是否绝对确保您的 OpenGL 上下文已完全初始化。这是一个全局对象吗,因为它的构造函数可能在 main 之前被调用?
    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多