0

Linux mint で Qt Creator を使用しており、opengl プログラムを実行しようとしています。ビルドでエラーは発生しませんが、Qt Creator 内でプログラムを実行しようとすると、ターミナル ウィンドウが表示され、他に何も起こりません。ターミナルでプログラムを直接実行すると、次の出力が得られます。

OpenGL version supported by this platform (3.3.0 NVIDIA 295.40): 
OpenGL 3.3.0 NVIDIA 295.40, GLSL 3.30 NVIDIA via Cg compiler
Ready for OpenGL 2.0
Segmentation fault (core dumped)

私のコード:

#include <stdio.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glext.h>

int main(int argc, char **argv) {

    glutInit(&argc, argv);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(100, 100);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Aquarium");
    glutDisplayFunc(onDisplay);
    glutMouseFunc(onMouse);
    glutIdleFunc(onIdle);
    glutKeyboardFunc(onKeyboard);
    glutReshapeFunc(onReshape);

    printf("OpenGL version supported by this platform (%s): \n", glGetString(GL_VERSION));

    printf("OpenGL %s, GLSL %s\n",glGetString(GL_VERSION),glGetString(GL_SHADING_LANGUAGE_VERSION));

    glewInit();

    if (glewIsSupported("GL_VERSION_2_0"))
        printf("Ready for OpenGL 2.0\n");
    else {
        printf("OpenGL 2.0 not supported\n");
        exit(1);
    }

    onInitialization();

    glutMainLoop();

    return 0;
}

イベント ハンドラーを定義し、onInitialization() メソッドも用意しました。onInitialization() メソッドの先頭で何かを出力しようとすると、プログラムは以前に書き込んだ行以外には何も書きません。したがって、 onInitialization() 内にステップインしないと思います。Qt Creator でこのプログラムをデバッグすることさえできません。何が原因でしょうか? また、Qt Creator 内でプログラムを起動できない原因は何ですか? 私は .pro ファイルを持っています:

QT       -= gui core

TARGET = main
CONFIG   += console

TEMPLATE = app

LIBS += /usr/lib/libglut.so /usr/lib/compiz/libopengl.so /usr/lib/i386-linux-gnu/libGLU.so /usr/lib/i386-linux-gnu/libGLEW.so

QMAKE_CXXFLAGS += -W -Wall -Wextra -pedantic

SOURCES += main.cpp

同じ設定で、Windows でプログラムを実行することができました (もちろん、LIBS は異なっていました)。

onInitialization():

void onInitialization( ) {

    printf("onInitialization");

   soft.controlpoints.push_back(Point(5., 5., 5.));
   soft.speeds.push_back(Point(0., 0., 0.));
   soft.controlpoints.push_back(Point(5, -5., 5.));
   soft.speeds.push_back(Point(0., 0., 0.));
   soft.controlpoints.push_back(Point(5., -5., -5.));
   soft.speeds.push_back(Point(0., 0., 0.));

   soft2.controlpoints.push_back(Point(5., 5., 5.));
   soft2.speeds.push_back(Point(0., 0., 0.));
   soft2.controlpoints.push_back(Point(5, -5., 5.));
   soft2.speeds.push_back(Point(0., 0., 0.));
   soft2.controlpoints.push_back(Point(5., -5., -5.));
   soft2.speeds.push_back(Point(0., 0., 0.));
   soft2.controlpoints.push_back(Point(-5., 5., -5.));
   soft2.speeds.push_back(Point(0., 0., 0.));

   soft.set_r();
   soft2.set_r();

   aquarium.objects.push_back(&water);
   aquarium.objects.push_back(&fish);
   aquarium.objects.push_back(&field);
   aquarium.objects.push_back(&soft2);

   aquarium.createMaterials();

   aquarium.createVoxelArray();

   glEnable(GL_DEPTH_TEST);
   lastMovingTime = 0.;

   setShadowMapShaders();
   setAquariumShaders();

}

「onInitialization」文字列も出力しません。メソッド内のオブジェクトはグローバル変数であり、ここで呼び出されるすべてのメソッドが実装されています。「onInitialization」文字列が出力されない原因は何ですか? soft.controlpoints、soft.speeds、aquarium.object はパブリック フィールドです。他のすべてをコメントしても、文字列は表示されませんが、ウィンドウが作成されます。また、Qt Creator 内からはまだ実行されていません。

4

1 に答える 1

0

問題はファイル リーダー メソッド (GLSL シェーダー コードを読み込む) にあり、これは Qt Creator の作業ディレクトリがシェーダー ソース ファイルを含むディレクトリに設定されていなかったためであることが判明しました。

于 2012-08-30T21:35:44.043 に答える