3

D で SDL と OpenGL を設定しようとしています。具体的には、SDL2 と OpenGL 3.3 コア/前方互換性があります。(ただし、最後の 2 つを例では省略しましたが、それらが存在するかどうかに関係なく同じポイントで中断するためです)。GLFW の以下に相当するものは問題なく動作するので、どうやら私は SDL 側で何かを台無しにしているか、または SDL が Derelict を壊す魔法のようなことを行っているようです。いくつかの関数ポインタをロードする以外は、どこかで何かがうまくいかず、Derelict または SDL のバグを除外しませんが、それは私のコードである可能性が高いです。

私はそれを見ませんが、ここにあります:

import std.stdio;
import std.c.stdlib;
import derelict.sdl2.sdl;
import derelict.opengl3.gl;

void fatal_error_if(Cond,Args...)(Cond cond, string format, Args args) {
    if(!!cond) {
        stderr.writefln(format,args);
        exit(1);
    }
}

void main()
{ 
    //set up D bindings to SDL and OpenGL 1.1
    DerelictGL.load();
    DerelictSDL2.load();
    fatal_error_if(SDL_Init(SDL_INIT_VIDEO),"Failed to initialize sdl!");

    // we want OpenGL 3.3
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3);

    auto window = SDL_CreateWindow(
            "An SDL2 window",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            800,
            600,
            SDL_WINDOW_OPENGL); // we want this window to support OpenGL
    fatal_error_if(window is null,"Failed to create SDL window!");

    auto glprof = SDL_GL_CreateContext(window); // Create the actual context and make it current
    fatal_error_if(glprof is null,"Failed to create GL context!");

    DerelictGL.reload(); //<-- BOOM SIGSEGV

    // just some stuff so we actually see something if nothing exploded
    glClearColor(1,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    SDL_GL_SwapWindow(window);
    SDL_Delay(5000);
    SDL_DestroyWindow(window);
    SDL_Quit();
    writeln("If we got to this point everything went alright...");
}

質問のタイトルにあるように、DerelictGL.reload() (GLEW に似た OpenGL 関数をロードすることになっています) で壊れます。これがスタックトレースです...

#0  0x00007ffff71a398d in __strstr_sse2_unaligned () from /usr/lib/libc.so.6
#1  0x000000000048b8d5 in derelict.opengl3.internal.findEXT() (extname=..., extstr=0x0)
    at ../../../../.dub/packages/derelict-gl3-master/source/derelict/opengl3/internal.d:74
#2  0x000000000048b8b0 in derelict.opengl3.internal.isExtSupported() (name=..., glversion=<incomplete type>)
    at ../../../../.dub/packages/derelict-gl3-master/source/derelict/opengl3/internal.d:67
#3  0x0000000000487778 in derelict.opengl3.gl.DerelictGLLoader.reload() (this=0x7ffff7ec5e80)
    at ../../../../.dub/packages/derelict-gl3-master/source/derelict/opengl3/gl.d:48
#4  0x0000000000473bba in D main () at source/app.d:36
#5  0x00000000004980c8 in rt.dmain2._d_run_main() ()
#6  0x0000000000498022 in rt.dmain2._d_run_main() ()
#7  0x0000000000498088 in rt.dmain2._d_run_main() ()
#8  0x0000000000498022 in rt.dmain2._d_run_main() ()
#9  0x0000000000497fa3 in _d_run_main ()
#10 0x00000000004809e5 in main ()

ここでのエラーは、glGetString(GL_EXTENSIONS) が null を返すために発生しているようです。どうせよく分からん。DerelictGL.reload の呼び出しを削除すると、残りのプログラムが実行されますが、それは OpenGL1.1 以降の関数が読み込まれないことを意味します。

これを実際の質問として表現するには、何か間違っていますか? もしそうなら、何?

追加

OpenGL 3.3 コンテキストが作成されたことを確認しました - glGet は GL_MAJOR_VERSION と GL_MINOR_VERSION でそれぞれ 3 を返します。

4

1 に答える 1

2

これは Derelict-gl3 のバグのようです - gl.d でこの行を変更すると

        if( maxVer >= GLVersion.GL12 && isExtSupported( GLVersion.GL12, "GL_ARB_imaging" ) ) {

        if( maxVer >= GLVersion.GL12 && isExtSupported( maxVer, "GL_ARB_imaging" ) ) {

それは正常に動作します。私はgithub リポジトリに問題を提出し、これが実際に当てはまるかどうかを確認します (Derelict の仕組みについてはあまり詳しくありませんが、これはかなり明白に思えます)。

于 2014-02-13T11:00:43.243 に答える