2015-02-11 104 views
2

我正試圖讓OpenGL-ES在Raspberry Pi上工作,但至今沒有運氣。我整理了SDL 2.0.3從源代碼本,如Rasbian版本缺少樹莓派支持:如何讓OpenGL-ES與SDL2一起在Raspberry Pi上工作?

./configure --prefix=/home/pi/run/SDL2-2.0.3/ \ 
    --disable-video-x11 \ 
    --disable-pulseaudio \ 
    --disable-esd \ 
    --disable-video-opengl 

下面的代碼應該創建一個OpenGL上下文並清除屏幕爲紅色。當我運行代碼時,Raspberry Pi正在切換視頻模式,但屏幕變成黑色而不是紅色,並且glGetString(GL_VERSION)和Co.的調用返回NULL,這表明GL上下文創建出現問題。

#include <SDL.h> 
#include <SDL_opengles2.h> 
#include <iostream> 

void print_gl_string(GLenum name) 
{ 
    const GLubyte* ret = glGetString(name); 
    if (ret == 0) 
    { 
    std::cerr << "error getting string: " << name << std::endl; 
    } 
    else 
    { 
    std::cerr << name << ": " << ret << std::endl; 
    } 
} 

void set_gl_attribute(SDL_GLattr attr, int value) 
{ 
    if (SDL_GL_SetAttribute(attr, value) != 0) 
    { 
    std::cerr << "SDL_GL_SetAttribute(" << attr << ", " << value << ") failed: " << SDL_GetError() << std::endl; 
    } 
} 

int main() 
{ 
    if (SDL_Init(SDL_INIT_VIDEO) != 0) 
    { 
    std::cerr << "SDL_Init() failed: " << SDL_GetError() << std::endl; 
    exit(EXIT_FAILURE); 
    } 

    SDL_DisplayMode videomode; 
    if (SDL_GetCurrentDisplayMode (0, &videomode) != 0) 
    { 
    std::cerr << "Error getting current display mode: " << SDL_GetError() << std::endl; 
    exit(EXIT_FAILURE); 
    } 

    std::cout << "Current screen mode: " << videomode.w << "x" << videomode.h << std::endl; 

    set_gl_attribute(SDL_GL_RED_SIZE, 5); 
    set_gl_attribute(SDL_GL_GREEN_SIZE, 6); 
    set_gl_attribute(SDL_GL_BLUE_SIZE, 5); 
    //set_gl_attribute(SDL_GL_DEPTH_SIZE, 8); 
    set_gl_attribute(SDL_GL_DOUBLEBUFFER, 1); 

    set_gl_attribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); 
    set_gl_attribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); 
    set_gl_attribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); 

    SDL_Window* window = SDL_CreateWindow("Minimal SDL2 Example", 
             SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
             720, 576, 
             SDL_WINDOW_OPENGL); 
    if (!window) 
    { 
    std::cerr << "Could not create window: " << SDL_GetError() << std::endl; 
    exit(EXIT_FAILURE); 
    } 

    SDL_GLContext gl_context = SDL_GL_CreateContext(window); 

    print_gl_string(GL_RENDERER); 
    print_gl_string(GL_SHADING_LANGUAGE_VERSION); 
    print_gl_string(GL_VERSION); 
    print_gl_string(GL_EXTENSIONS); 

    glClearColor(1.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    SDL_GL_SwapWindow(window); 

    SDL_Delay(5000); 

    SDL_GL_DeleteContext(gl_context); 
    SDL_DestroyWindow(window); 
    SDL_Quit(); 

    return 0; 
} 

回答

1

問題原來不在代碼中,而是在庫路徑中。一個簡單的-L/opt/vc/lib/添加到編譯命令行修復它。如果沒有,編譯器會選擇:

/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 

雖然正確的是(使用ldd檢查):

/opt/vc/lib/libGLESv2.so 
+0

這是否意味着你能夠編寫編譯爲RPI-OpenGL三維碼-ES而不是X11-OpenGL? – Jackalope 2018-03-09 19:58:03