skip to Main Content

I really don’t know what I’m doing wrong here. When I look up my issue, almost all the answers are solved by adding an event loop. I have an event loop already and I know its working because I used cout in my input function and it just filled up the terminal. I almost feel like the issue is related to the Ubuntu I’m running, maybe because I’m running it on a Gen 1 Surface Book. That being said, I updated my Mesa to 20.3.0 and my computer is compatible with OpenGL 4.6 so maybe that’s not it.

Anyways this is the code I have. The program compiles with no issues, and it runs. The only issue is that the window does not show up on the screen. PS, I’ve also already tried calling SDL_SetMainReady(); right before the SDL_Init()

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

// Globals
int gScreenWidth = 640;
int gScreenHeight = 480;
SDL_Window* gWindow = nullptr;
SDL_GLContext gContext = nullptr;

bool gQuit = false; // if true we quit

void InitializeProgram(){
    if(SDL_Init(SDL_INIT_VIDEO) < 0){
        std::cout << "SDL2 could not initialize video subsystem" << std::endl;
        exit(1);
    }

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

    gWindow = SDL_CreateWindow("OpenGL First Program", 0, 0, gScreenWidth, gScreenHeight, SDL_WINDOW_OPENGL);
    if(gWindow == nullptr){
        std::cout << "SDL Window could not be created" << std::endl;
        exit(1);
    }

    gContext = SDL_GL_CreateContext(gWindow);
    if(gContext == nullptr){
        std::cout << "OpenGL Context could not be created" << std::endl;
        exit(1);
    }
}

void Input(){
    SDL_Event e;
    while(SDL_PollEvent(&e)){
        if(e.type == SDL_QUIT){
            std::cout << "Goodbye!" << std::endl;
            gQuit = true;
        }
    }
}

void PreDraw(){

}

void Draw(){

}

void MainLoop(){
    while(!gQuit){
        Input();
        PreDraw();
        Draw();
        SDL_GL_SwapWindow(gWindow); // Updates the screen
    }
}

void CleanUp(){
    SDL_DestroyWindow(gWindow);
    SDL_Quit();
}

int main(){
    InitializeProgram();

    MainLoop();

    CleanUp();

    return 0;
}

2

Answers


  1. Try SDL_WINDOW_SHOWN ~

     SDL_Window *window = SDL_CreateWindow("Basic C++ SDL project",
                                              SDL_WINDOWPOS_UNDEFINED,
                                              SDL_WINDOWPOS_UNDEFINED,
                                              SCREEN_WIDTH, SCREEN_HEIGHT,
                                              SDL_WINDOW_SHOWN);
    
    Login or Signup to reply.
  2. I just tested using your code and sample

    • Window pop ups
    • Used a triangle sample from source and combined all into main

    On my machine major & minor versions failed even though they re correct – failed to create context so removed.

    SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL made the window visible.

    #include <SDL.h>
    #include <SDL_opengl.h>
    #include <iostream>
    
    // Define MAX and MIN macros
    #define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
    #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
    
    // Define screen dimensions
    #define SCREEN_WIDTH    800
    #define SCREEN_HEIGHT   600
    
    
    // Globals
    int gScreenWidth = 640;
    int gScreenHeight = 480;
    SDL_Window* gWindow = nullptr;
    SDL_GLContext gContext = nullptr;
    
    bool gQuit = false; // if true we quit
    
    
    int main(){
        if(SDL_Init(SDL_INIT_VIDEO) < 0){
            std::cout << "SDL2 could not initialize video subsystem" << std::endl;
            exit(1);
        }
    
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    
        gWindow = SDL_CreateWindow("OpenGL First Program", 0, 0, 
                gScreenWidth, gScreenHeight, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
    
        gContext = SDL_GL_CreateContext(gWindow);
    
        glMatrixMode(GL_PROJECTION|GL_MODELVIEW);
        glLoadIdentity();
        glOrtho(-320, 320, 240, -240, 0, 1);
    
        if(gWindow == nullptr){
            std::cout << "SDL Window could not be created" << std::endl;
            exit(1);
        }
    
        if(gContext == nullptr){
            std::cout << "OpenGL Context could not be created" << std::endl;
            exit(1);
        }
    
        SDL_Event e;
        float x = 0.0, y = 30.0;
    
        while (!gQuit)
        {
            SDL_PollEvent(&e);
    
            if (e.type == SDL_QUIT)
                gQuit = true;
    
            glClearColor(0,0,0,1);          // Draw with OpenGL.
            glClear(GL_COLOR_BUFFER_BIT);   
            glRotatef(10.0,0.0,0.0,1.0);     
            // Note that the glBegin() ... glEnd() OpenGL style used below is actually 
            // obsolete, but it will do for example purposes. For more information, see
            // SDL_GL_GetProcAddress() or find an OpenGL extension loading library.
            glBegin(GL_TRIANGLES);          
              glColor3f(1.0,0.0,0.0); glVertex2f(x, y+90.0);
              glColor3f(0.0,1.0,0.0); glVertex2f(x+90.0, y-90.0);
              glColor3f(0.0,0.0,1.0); glVertex2f(x-90.0, y-90.0);
            glEnd();
    
            SDL_GL_SwapWindow(gWindow);
            SDL_Delay(10);
        }
    
        SDL_GL_DeleteContext(gContext);
        SDL_DestroyWindow(gWindow);
    
        SDL_Quit();
    
        return 0;
    }
    
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search