2

Mac OS X 10.8.4 では、次のプログラムは、OpenGL コンテキストがウィンドウに関連付けられていないかのように動作します。

#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>

static void render( void );
static void gl_info( void );
static void dump_sdl_error( void );

SDL_Window* window = NULL;
SDL_GLContext ctx = NULL;

GLuint program = 0;
GLint attribute_vertex = 0;
GLint attribute_color = 0;


int main( int argc, char* argv[] )
{
    if( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
        goto quit;
    }

    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 2 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );

    window = SDL_CreateWindow( "Test Shaders", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN );

    if( window == NULL )
    {
        dump_sdl_error( );
        goto quit;
    }

    ctx = SDL_GL_CreateContext( window );

    if( !ctx )
    {
        dump_sdl_error( );
        goto quit;
    }

    dump_sdl_error( );

    gl_info( );


    render( );

quit:
    if( ctx ) SDL_GL_DeleteContext( ctx );
    if( window ) SDL_DestroyWindow( window );
    SDL_Quit( );
    return 0;
}


void render( )
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
    glClearColor( 1.0, 0.0, 0.0, 1.0 );

    SDL_GL_SwapWindow( window );
}

void gl_info( void )
{
    const char* renderer     = (const char*) glGetString(GL_RENDERER);
    const char* version      = (const char*) glGetString(GL_VERSION);
    const char* glsl_version = (const char*) glGetString(GL_SHADING_LANGUAGE_VERSION);

    fprintf( stdout, "[GL] Renderer: %s\n", renderer ? renderer : "unknown" );
    fprintf( stdout, "[GL] Version: %s\n", version ? version : "unknown" );
    fprintf( stdout, "[GL] Shading Language: %s\n", glsl_version ? glsl_version : "unknown" );
}


void dump_sdl_error( void )
{
    const char* sdl_error = SDL_GetError( );

    if( sdl_error && *sdl_error != '\0' )
    {
        fprintf( stderr, "[SDL] %s\n", sdl_error );
    }
}

上記のプログラムは、次の出力を生成します。

$ ./bin/test-shaders 
[GL] Renderer: unknown
[GL] Version: unknown
[GL] Shading Language: unknown

文脈がないようですが、迷っています。GLSL のバージョンとグラフィック ハードウェアが表示されることを期待していますが、glGetString() が NULL を返すようです。そこにSDL2の専門家はいますか?

4

1 に答える 1

2

問題が見つかりました。どうやら、「-framework OpenGL」がなくてもコードはコンパイルされます

私は SDL2 に付属のテスト プログラムを調べることでこれを解決し、それらが実際に機能し、フレームワークの OpenGL が欠落していることを発見しました。これが他の誰かに役立つことを願っています。

アンドンさん、ありがとうございます。

私はこれを変更しました:

__top_builddir__bin_test_sdl_SOURCES = test-sdl.c
__top_builddir__bin_test_sdl_LDFLAGS = -lGL -lSDL2 $(top_builddir)/lib/.libs/libsimplegl.a

これに:

__top_builddir__bin_test_sdl_SOURCES = test-sdl.c
__top_builddir__bin_test_sdl_LDFLAGS = -lGL -lSDL2 -framework OpenGL $(top_builddir)/lib/.libs/libsimplegl.a
于 2013-09-13T04:54:39.020 に答える