输入 glBegin() 后的 OpenGL 分段错误

Posted

技术标签:

【中文标题】输入 glBegin() 后的 OpenGL 分段错误【英文标题】:OpenGL Segmentation Fault after typing glBegin() 【发布时间】:2016-11-04 06:59:06 【问题描述】:

我对 OpenGL 编程非常陌生,一切都很好,直到我突然收到分段错误,现在无法摆脱它。谁能发现分段错误并向我解释?

注意:虽然是作业,但我不是来这里寻找答案的。事实上,我什至不会提及分配细节,甚至不会发送完整代码(尽管,以下代码也会导致段错误):

#  include <stdio.h>
#  include <stdlib.h>
#  ifdef __APPLE__
#  include <OpenGL/gl.h>
#  include <OpenGL/glu.h>
#  include <GLUT/glut.h>
#  else
#  include <GL/gl.h>
#  include <GL/glu.h>
#  include <GL/freeglut.h>
#  endif
#  include <iostream>
#  include <ctime>
#  include <cmath>
using namespace std;

#define GRID 50 

/* Eye location */
float eye[]=5,5,5;

void initDefaults(void)
    glClearColor(0, 0, 0, 0);
    glColor3f(1, 1, 1);
    glMatrixMode(GL_PROJECTION);
    glFrustum(-10,10,-10,10,0,100);
    gluPerspective(45,1,1,100);


/* TEMPORARY */
void createGrid()  

//After checking, I narrowed down the segmentation fault to here.   
    glColor3f(0, 0, 0);
    printf("help");
    glBegin(GL_POINTS);
    glVertex3f(25,25,25);
    glEnd();


/* displays UI to user */
void display(void)

    //Clears the board upon (re)display
    glClearColor(1.0,1.0,1.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    //Enables backface culling
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    //Sets up the perspective matrix (viewing/camera)
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();
    gluLookAt(eye[0], eye[1], eye[2], GRID/2, GRID/2, 0, 0, 1, 0); 

    //I believe the segmentation fault occurs in here.
    //************************************
    createGrid();
    //************************************

    //Used for double-buffering
    glutSwapBuffers();


/* main function - program entry point */
int main(int argc, char** argv)

    glutInit(&argc, argv);                                      
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(200,200);
    glutCreateWindow("Terrain");                                
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
    glutDisplayFunc(display);                         
    gluOrtho2D(-1, GRID + 1, -1, GRID + 1);
    initDefaults();
    glutMainLoop();                                             
    return(0);                                                  

【问题讨论】:

考虑使用着色器,它们使更大的项目成为可能。顺便说一句,freeglut 是我最喜欢的图书馆;) 【参考方案1】:

仔细检查您的开发环境。您的代码(到目前为止)非常好,您所遇到的可能是由不匹配的库引起的。例如,如果您在 Linux 上进行开发,libGL.so 必须与 GPU 驱动程序和版本完全匹配(或使用的纯间接 GLX 上下文,这通常仅适用于远程 X11)。

【讨论】:

以上是关于输入 glBegin() 后的 OpenGL 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:顶点数组与 glBegin()

VBO 何时比“简单”的 OpenGL 基元 (glBegin()) 更快?

是啥导致基于 OpenGL 2.0 的着色器处理代码在 ::glBegin() 中崩溃?

2D中的opengl glBegin(GL_LINES)和glBegin(GL_POINT)不可视化点向量

OpenGL入门程序

鼠标移动opengl