我正在学习一些教程并提出以下代码:
// rendering.cpp
#include "rendering.h"
#include <GL/gl.h>
#include <GL/freeglut.h>
void DrawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}
int InitGL(int argc, char** argv)
{
/*glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);*/
glutInit(&argc, argv);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutDisplayFunc(DrawGLScene);
glutCreateWindow("Swimming Simulation");
glutMainLoop(); // Enter GLUT's main loop
return true;
}
我的主要功能非常简单,只调用该功能:
#include "rendering.h"
int main(int argc, char** argv)
{
InitGL(argc, argv);
return 0;
}
我正在使用此命令进行编译:
g++ -Wall -g swim.cpp rendering.cpp -lglut -lGLU -o swim
运行swim
会按预期创建一个窗口。但是,如果我取消注释InitGL
中的行,那么在运行程序时会出现分段错误:
(gdb) r
Starting program: <dir>
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x000000335ca52ca7 in glShadeModel () from /usr/lib64/libGL.so.1
Missing separate debuginfos, use: debuginfo-install freeglut-2.6.0-6.fc15.x86_64 glibc-2.14.90-24.fc16.6.x86_64 libX11-1.4.3-1.fc16.x86_64 libXau-1.0.6-2.fc15.x86_64 libXdamage-1.1.3-2.fc15.x86_64 libXext-1.3.0-1.fc16.x86_64 libXfixes-5.0-1.fc16.x86_64 libXi-1.4.5-1.fc16.x86_64 libXxf86vm-1.1.1-2.fc15.x86_64 libdrm-2.4.33-1.fc16.x86_64 libgcc-4.6.3-2.fc16.x86_64 libstdc++-4.6.3-2.fc16.x86_64 libxcb-1.7-3.fc16.x86_64 mesa-libGL-7.11.2-3.fc16.x86_64 mesa-libGLU-7.11.2-3.fc16.x86_64
(gdb) backtrace
#0 0x000000335ca52ca7 in glShadeModel () from /usr/lib64/libGL.so.1
#1 0x0000000000401d67 in InitGL (argc=1, argv=0x7fffffffe198)
at rendering.cpp:25
#2 0x0000000000401c8c in main (argc=1, argv=0x7fffffffe198) at swim.cpp:37
我应该在这做什么才能使我的程序在不崩溃的情况下运行?
答案 0 :(得分:5)
你陷入了GLUT棘手的陷阱。 GLUT是一种类似OpenGL的状态机(它不是OpenGL的一部分)。并且必须在创建或选择窗口后设置回调函数。在您的情况下,在调用glutDisplayFunc
之后移动glutCreateWindow
(以及任何其他回调设置者)的调用。
答案 1 :(得分:2)
摆脱过剩并使用像GLFW更好的东西 而且很多这些函数都被弃用了,所以请使用像这样的现代教程 http://www.opengl-tutorial.org/ 要么 http://ogldev.atspace.co.uk/
答案 2 :(得分:1)
只有在存在OpenGL上下文时才能调用OpenGL函数 - 如果使用GLUT,则在glutCreateWindow函数调用之后调用。
但他们不应该崩溃应用程序......