0

私はいくつかのチュートリアルに従っており、次のコードを思いつきました:

// 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

クラッシュせずにプログラムを実行するには、ここで何をすべきですか?

4

3 に答える 3

5

あなたは GLUT のトリッキーな落とし穴に陥りました。GLUT は、OpenGL のようなステート マシンのようなものです (OpenGL の一部ではありません)。また、コールバック関数は、ウィンドウを作成または選択した後に設定する必要があります。あなたの場合、 の呼び出しのglutDisplayFunc後に (および他のコールバック セッター) の呼び出しを移動しますglutCreateWindow

于 2012-05-27T08:02:32.833 に答える
3

過剰を取り除き、GLFWのようなより良いものを使用します。また、これらの関数の多くは非推奨になっているため、http://www.opengl-tutorial.org/やhttp://ogldev.atspace.co.uk/のような最新のチュートリアルを使用し ください

于 2012-05-27T08:38:22.880 に答える
1

OpenGL 関数は、OpenGL コンテキストがある場合にのみ呼び出すことができます。GLUT を使用している場合は、glutCreateWindow 関数呼び出しの後です。

ただし、アプリケーションをクラッシュさせるべきではありません...

于 2012-05-27T07:49:18.323 に答える