1

D2でDerelict3を使用して実行する基本的なGLFWの例を取得しようとしています。この例は、Dメーリングリストのアーカイブから取得しました:http://forum.dlang.org/thread/byorhjqpppsgqiwfrigd@forum.dlang.org

これまでの私のコードは次のとおりです。

import std.stdio;

import derelict.opengl3.gl;
import derelict.glfw3.glfw3;

pragma(lib, "DerelictGL3");
pragma(lib, "DerelictGLFW3");
pragma(lib, "DerelictUtil");
pragma(lib, "dl");

const int width = 800;
const int height = 600;

void init() {
    glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
        glVertex2d(0,0);
        glVertex2d(0,height);
        glVertex2d(width,height);
        glVertex2d(height,0);
    glEnd();
}

extern (C) {
    void resizeWindow(GLFWwindow window, int w, int h) {
    }

    void refreshWindow(GLFWwindow window) {
        writeln("Refresh");
        display();
    }

    void mouseMove(GLFWwindow window, int x, int y) {
    }

    void mouseClick(GLFWwindow window, int button, int action) {
    }

    int windowClose(GLFWwindow window) {
        //running = false;
        return GL_TRUE;
    }

    void keyTrigger(GLFWwindow window, int key, int action) {
        if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {
            //running = false;
        }
    }
}

void main() {
    DerelictGL.load();
    DerelictGLFW3.load();

    if (!glfwInit()) {
        writeln("glfwInit didn't work");
        return;
    }

    auto window = glfwCreateWindow(width,height,GLFW_WINDOWED,"Hello 
DerelictGLFW3",null);
    glfwMakeContextCurrent(window);

    init();

    // register callbacks
    /*
    glfwSetWindowRefreshCallback(window, &refreshWindow);
    glfwSetWindowSizeCallback(window, &resizeWindow);
    glfwSetCursorPosCallback(window, &mouseMove);
    glfwSetMouseButtonCallback(window, &mouseClick);
    glfwSetWindowCloseCallback(window, &windowClose);
    glfwSetKeyCallback(window, &keyTrigger);
    */

    bool opened = true;
    while(opened) {
        display();
        glfwSwapBuffers(window);

        writeln("Before");
        glfwPollEvents();
        writeln("After");
    }
    glfwTerminate();
}

これは現在、期待どおりにコンパイルおよび実行されますが、すべてのコールバック登録のコメントを解除するとすぐに、直前にセグメンテーション違反が発生しglfwPollEvents()ます。

ここで何が起こっているのかわかりません。ライブラリの競合である可能性があると思いましたが、他のすべてはうまく機能しているようです。

構築:

dmd -I$HOME/sandbox/Derelict3/import -L-L$HOME/sandbox/Derelict3/lib -ofgame test.d

プラットフォーム:Linux x64(Fedora 17)

$HOME/sandbox/Derelict3https://github.com/aldacron/Derelict3のgitクローンです

また、Derelict3とGLFWを使用して単純な形状をレンダリングする例はありますか?

4

1 に答える 1

1

https://github.com/elmindreda/glfw.gitの最新の Derelict3 (commit b133eda) と GLFW3 (26abe0a) を使用すると、あなたのコードは問題なく動作します。

私はこれらのことをします(この順序で):

  1. Derelict 共有ライブラリが最新であることを確認します ( rdmd build.dDerelict3/build ディレクトリで実行します)。
  2. GLFW3 ライブラリが最新であることを確認します (ソースからビルドしていると想定しているため、新しいコミットが入った場合は必ずプルして再構築してください)。を忘れないでくださいmake install
  3. それでも問題が発生する場合は、GDB を使用してバックトレースを取得してみてください (テスト コードを -g でコンパイルすることをお勧めします)。

それほど単純ではない例 (プログラム可能なパイプラインを使用): https://gist.github.com/4090381

于 2012-11-16T19:50:59.700 に答える