Opengl 未定义行为

Posted

技术标签:

【中文标题】Opengl 未定义行为【英文标题】:Opengl undefined behavior 【发布时间】:2014-08-09 14:38:11 【问题描述】:

我在使用 Opengl 时遇到了一些奇怪的行为。我做错了什么,但我无法找出它是什么。

我有 HD Graphics 3000 加速器,并且我在 Ubuntu 14.04 上安装了 Opengl 3.0。

问题是有时什么都没有被绘制出来,尤其是在进行小的翻译时,这应该会使其可见。渲染纹理时出现分割错误。

以下是代码的重要部分:

启动 SDL,创建 opengl 上下文等

if (SDL_Init(SDL_INIT_VIDEO) < 0) 
    exit(1);


SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);



mainwindow = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
    512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);


maincontext = SDL_GL_CreateContext(mainwindow);

glewInit();;


SDL_GL_SetSwapInterval(1);

启动opengl:

glClearColor(0.0,0.0,0.0,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45,(double)width/(double)height,1,100.0);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);  //we enable lighting, to make the 3D object to 3D
glEnable(GL_LIGHT0);
glEnable(GL_TEXTURE_2D);
float col[]= 1.0,1.0,1.0,1.0; //light color is white
glLightfv(GL_LIGHT0,GL_DIFFUSE,col);
glEnable(GL_NORMALIZE);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

渲染:

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glClearColor ( 0.0, 0.0, 0.0, 1.0 );
glLoadIdentity();
glTranslatef(0,0,-5);

glColor3f(1,0,0);

glBegin(GL_TRIANGLES);
    glVertex3f(-1,-1,-5);
    glVertex3f(1,-1,-5);
    glVertex3f(0,1,-5);
glEnd();

我实际上渲染了一些加载的模型,但由于某种原因甚至没有显示这个三角形。如果我渲染模型,在加载纹理时,使用 SOIL 提供的自动例程将图像加载到 opengl 时会发生分段错误。

有什么想法吗? 我还在 opengl 和启动 GLEW 时检查错误,但没有任何错误。

【问题讨论】:

到目前为止您发布的代码还远未完成。没有人能告诉你为什么它可能会在未发布的部分出现段错误。但是,从这里剩下的内容来看,似乎您尝试使用默认纹理对象对三角形进行纹理处理,但实际上没有图像,仅此一项就可能引发全黑结果。您可以更改背景颜色并检查是否实际出现黑色三角形。 如果我将背景更改为绿色,则没有黑色三角形。我实际上是在解释发生的不同事情。目前,这是运行的,没有别的。我不加载纹理或任何东西。 但是你启用了纹理。你不应该这样做。 我复制了有关绘图的代码,看来我的模型渲染正确。也许 Opegl 上下文或类似的东西存在一些问题,我正在做一些非常糟糕的事情。我会调查的。 【参考方案1】:

好的,问题是我在没有启动 SDL 和创建上下文的情况下使用 Opengl(调用闪电、设置视图等)。奇怪的是,Opengl 没有调用任何错误。

【讨论】:

以上是关于Opengl 未定义行为的主要内容,如果未能解决你的问题,请参考以下文章

glew未定义的OpenGL函数[关闭]

OpenGL 项目返回未定义的引用

OpenGL 纹理未按定义显示

OpenGL 函数未定义 OSX

编译opengl的未定义引用

在 Geany 中使用 OpenGL 时获得未定义的参考 [重复]