glDrawArrays中的OpenGL segfault [关闭]

kxe2p93d  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(93)

**已关闭。**此问题是在寻求有关书籍、工具、软件库等内容的建议。它不符合Stack Overflow guidelines。它目前不接受回答。

我们不允许提问以寻求书籍、工具、软件库等方面的建议。您可以编辑问题,以便使用事实和引文回答。
10天前关门了。
这篇文章是编辑并提交审查8天前.
Improve this question
我有一个C++代码,可以在远程Linux机器上运行,进行数学计算。我正在使用XQuartz(X窗口终端)从M1 Mac访问Linux机器。我希望能够真实的显示数据图。由于前面的响应,我做了一个更正,但现在我在glDrawArrays函数处崩溃了。

#include <GL/glew.h>
#include <GL/glut.h>
#include <math.h>

GLuint vaoid[2];
GLuint vboid[2];

void init()
{
  glClearColor (1.0, 1.0, 1.0, 1.0);
  glShadeModel (GL_FLAT);
}

void display()
{
  glClear (GL_COLOR_BUFFER_BIT);
  glColor3f (0.0, 1.0, 0.0);
  glLineWidth(3.0f);
  glBegin(GL_LINE_STRIP);
  int i;
  for (i=0; i<100; ++i)
    glVertex2f(i*6, 300+100.*cos(i*2.*M_PI/100));
  glEnd();
  glBindVertexArray(vaoid[0]);
  glDrawArrays(GL_LINE_STRIP, 0, 3); // <-- segfault here
  glBindVertexArray(0);
  glEnd();
  glFlush();      
}

void reshape (int w, int h)
{
  glViewport (0, 0, (GLsizei) w, (GLsizei) h);
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity ();
  gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
}

void createPoints(void)
{
  float vertices[6] = {100., 100., 400., 100., 400., 500.};
  glGenVertexArrays(1, vaoid); 
  glBindVertexArray(vaoid[0]);
  glGenBuffers(1, vboid);
  glBindBuffer(GL_ARRAY_BUFFER, vboid[0]);
  glBufferData(GL_ARRAY_BUFFER, 6*sizeof(GLfloat), vertices, GL_STATIC_DRAW);
  glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
  glEnableVertexAttribArray(0);
  glBindVertexArray(0);
}

int main(int argc, char** argv)     
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);    
  glutInitWindowSize (600, 600);
  glutInitWindowPosition (100,100);
  glutCreateWindow (argv[0]);
  glewExperimental = GL_TRUE; 
  glewInit ();
  createPoints();
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMainLoop();
  return 0;
}

字符集

rpppsulh

rpppsulh1#

segfaulting是因为您没有加载GL函数,并且基本上调用了一个弱链接(但未加载)函数(在本例中为glGenVertexArrays)。要解决这个问题,请使用GLEW或GLAD等加载器。另请参阅Load GL FunctionsOpenGL Loading Library了解更多信息。
我不会为苹果的行为而担心。如果你最终创建了一个更大的代码库,你可以引入API抽象,这样不管OpenGL将来是否被弃用。

相关问题