2016-05-31 12 views
0

Ich habe schon SDL2 benutzt, und jetzt versuche ich es mit openGL 2.1 zu verwenden. Aber wenn ich versuche, einen Renderer zu erstellen, bekomme ich "Ungültiger Renderer". Zum Erstellen eines Renderers verwende ich bereits die gleiche Zeile für ein einfaches SDL2-Projekt, aber mit openGL scheint es nicht richtig zu funktionieren. Hat jemand eine Idee warum? Ich habe versucht, die Flags von CreateRenderer zu ändern, und ich habe diesen Fehler für alle außer "SDL_RENDERER_SOFTWARE", aber mit ihm kann ich die Eingabe nicht richtig greifen, und wenn der Mauszeiger aus dem Fenster geht, habe ich diesen Fehler: " Ungültiges Fenster "."Ungültiger Renderer" mit SDL2 & OpenGL

Hier ist mein Code:

#include <SDL2/SDL.h> 
#include <GL/glut.h> 
#include <iostream> 

const int WIDTH = 500, HEIGHT = 500; 

using namespace std; 

SDL_Window* pWindow; 
SDL_Renderer* pRenderer; 
SDL_Event event; 

void initOGL() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(70,(double)WIDTH/HEIGHT,1,1000); 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
} 

void initSDL() 
{ 
    if (SDL_Init(SDL_INIT_VIDEO) != 0) 
    { 
     cout << "Video init failed" << endl; 
     exit(EXIT_FAILURE); 
    } 
    cout << "Video initialized" << endl; 


    // Window creation 
    pWindow = SDL_CreateWindow("Test OGL w/ SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL); 
    if (!pWindow) 
    { 
     cout << "Window creation failed" << endl; 
     exit(EXIT_FAILURE); 
    } 
    cout << "Window created" << endl; 

    // Renderer creation 
    pRenderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED); 
    if (!pRenderer) 
    { 
     cout << "Renderer creation failed" << endl; 
    } 
    cout << "Renderer created" << endl; 

    // OGL version 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); 

    // OGL context 
    SDL_GLContext contexteOGL = SDL_GL_CreateContext(pWindow); 
    if (!contexteOGL) 
    { 
     cout << "Echec création du contexte" << endl; 
    } 
    cout << "Contexte créé" << endl; 
} 

int main(int argc, char const *argv[]) 
{ 
    initSDL(); 
    initOGL(); 
    cout << "SDL_ERROR : " << SDL_GetError() << endl; 
    return 0; 
} 
+0

Ich würde vorschlagen, ein Kompatibilitäts Profil anzufordern, wenn Sie wirklich OpenGL benötigen 2.1. Es wird jedoch möglicherweise nicht auf Ihrer Plattform unterstützt. 2.1 ist wirklich alt, Sie sollten eine neuere Standardversion verwenden> = 3.0 –

+1

Das Mischen von 'SDL_CreateRenderer' und' SDL_GL_CreateContext' sieht nicht nach einer guten Idee aus. Im besten Fall wird es den Kontext durch einen neuen ersetzen. Wenn Sie die SDL2-Rendering-API nicht verwenden, erstellen Sie keinen Renderer, richten Sie nur den Kontext ein und zeichnen Sie mit dem GL. – keltar

+0

Danke für Ihre Antworten. Jan Henke: Ja, aber ich denke meine Hardware unterstützt nicht> = openGL plus Ich bin überhaupt nicht vertraut und ich habe keine Zeit, meinen Code neu zu starten und zu übersetzen, weil es für ein Projekt ist und ich nur noch einen Monat habe:/ keltar: Ja, aber ich denke, ich brauche SDL für die Texturen, nicht wahr? –

Antwort

0

ich konnte ein "built-in unterstützten Treiber" Problem, wenn Sie von der Quelle in Linux zum Beispiel SDL zusammengestellt.

Versuchen Sie, "Flags = 0" in SDL_CreateRenderer (pWindow, -1, 0) zu verwenden;

testen dann die eigentlichen ausgewählten Renderer (dies ist in C):

SDL_RendererInfo ri; 
SDL_GetRendererInfo(pRenderer, &ri); 
int n = SDL_GetNumRenderDrivers(); 
printf("Rendering drivers (%i):", n); 
for(int i = 0; i < n; i++) { 
    SDL_RendererInfo info; 
    SDL_GetRenderDriverInfo(i, &info); 
    printf(" '%s'", info.name); 
} 
printf(", active = '%s'\n", ri.name); 

Die vollständigen Quellcode ist here