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 未定义行为的主要内容,如果未能解决你的问题,请参考以下文章