SDL не отображает форму

В моем проекте у меня возникли проблемы с отображением треугольника в OnRender(), но по какой-то причине ничего, кроме цвета фона (зеленого), не видно.

int main(int argc, char **argv)
{
    if (!OnInit())
    return -1;
    SDL_Event Event;

    while (_isRunning)
    {
        while (SDL_PollEvent(&Event))
            OnEvent(&Event);

        OnRender();
        OnLoop();
        SDL_GL_SwapWindow(_screen);
    }

    OnCleanup();

    return 0;
}

void generalSetup()
{
    // Initialize SDL2
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
        sdldie("Failed to initial SDL2.");
    else
    {
        /* Request OpenGL 3.2 */
        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);

        // Create window
        _screen = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);        

        // Create Context
        _mainContext = SDL_GL_CreateContext(_screen);

        // Create Surface
        _surface = SDL_GetWindowSurface(_screen);
        SDL_FillRect(_surface, NULL, SDL_MapRGB(_surface->format, 0xCC, 0x20, 0x20));
        SDL_UpdateWindowSurface(_screen);

        /* swap synchronized */
        SDL_GL_SetSwapInterval(1);

        // Initialize GLew 1.10
        glewExperimental = GL_TRUE;
        GLenum error = glewInit();

        if (error != GLEW_OK)
            printf("Warning: Unable to set VSync! SDL Error: %s\n", SDL_GetError());
        else
            std::cout << "GLew Initialized" << std::endl;


        glClearColor(0, 1, 0, 0);

        glViewport(0, 0, 800, 600);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();

        gluPerspective(45, 800 / 600, 1, 1000);
        gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
}


bool OnInit()
{
    generalSetup();
    return true;
}

void OnEvent(SDL_Event* Event)
{
    if (Event->type == SDL_QUIT)
        _isRunning = false;
}

void OnLoop()
{

}

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

    glPushMatrix();
    glTranslatef(0.f, 0.f, -10.f);
    glBegin(GL_TRIANGLES);
    glColor3f(0.1, 0.2, 0.3);
    glVertex3f(0, 0, 0);
    glVertex3f(1, 0, 0);
    glVertex3f(0, 1, 0);
    glEnd();
    glPopMatrix();
}

void OnCleanup()
{
    SDL_GL_DeleteContext(_mainContext);
    SDL_DestroyWindow(_screen);
    SDL_Quit();
}

person Community    schedule 26.03.2014    source источник


Ответы (2)


Вы запросили основной контекст. Ни один из ваших кодов непосредственного режима (матричный стек, glBegin() и т. д.) не будет работать.

Вернитесь к контексту совместимости (SDL_GL_CONTEXT_PROFILE_COMPATIBILITY) или предоставьте все необходимые шейдеры, буферы вершин и т. д., которые требуются Core.

person genpfault    schedule 26.03.2014
comment
То есть я изначально был настроен на vbos и шейдеры? - person ; 27.03.2014
comment
Похоже, вы изначально были настроены на рендеринг в немедленном режиме. Хотя я предполагаю, что это зависит от того, написали ли вы сначала код SDL_GL_SetAttribute() или OnRender(). - person genpfault; 27.03.2014

Вы пытаетесь рендерить через непосредственный режим, но он не поддерживается OpenGL 3.2. Попробуйте использовать версии 2.0 или 2.1, которые поддерживают как шейдеры (если вы собираетесь их использовать), так и непосредственный режим.

person TalesM    schedule 27.03.2014