Содержимое кадрового буфера OpenGL по умолчанию исчезает после цикла минимизации / восстановления? - PullRequest
0 голосов
/ 18 февраля 2019

Эта программа рисует точку за кадр до тех пор, пока экран не заполнится точками.

#include <SDL2/SDL.h>
#include <GL/glew.h>

int SCREEN_WIDTH = 500,
    SCREEN_HEIGHT = 500;

int main( int argc, char** argv )
    {
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 );
    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_ACCELERATED_VISUAL, 1 );

    SDL_Window* gWindow = SDL_CreateWindow( "Title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL);
    SDL_GLContext gContext = SDL_GL_CreateContext( gWindow );

    glewExperimental = GL_TRUE;
    glewInit();

    const char
    *vertex_shader_text=

        "#version 330 core\n"
        "uniform vec2 p;"
        "void main(){"
        "gl_Position = vec4(vec2(p),0,1);}",

    *fragment_shader_text=

        "#version 330 core\n"
        "out vec4 col;"
        "void main()"
        "{col =vec4(1,1,1,0);}";

    GLuint
    vs = glCreateShader(GL_VERTEX_SHADER),
    fs = glCreateShader(GL_FRAGMENT_SHADER),
    program = glCreateProgram(),
    p_loc;
    glShaderSource(vs, 1, &vertex_shader_text, NULL);
    glShaderSource(fs, 1, &fragment_shader_text, NULL);
    glCompileShader(vs);
    glCompileShader(fs);
    glAttachShader(program, vs);
    glAttachShader(program, fs);
    glLinkProgram(program);
    glUseProgram(program);

    float x= -1.f, y= -1.f;
    p_loc = glGetUniformLocation(program, "p");

    glPointSize(3);
    glViewport(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
    SDL_GL_SetSwapInterval(1);

    int quit=0;
    SDL_Event event;

    while( !quit )
        {
        while(SDL_PollEvent( &event ))
            {if( event.type == SDL_QUIT )
                quit = 1;}

        x+=.01f;
        if(x > 1) {
            x-=2;
            y+=.01f; }

        glUniform2f(p_loc, x, y);
        glDrawArrays(GL_POINTS,0,1);
        SDL_GL_SwapWindow( gWindow );
        }
    SDL_DestroyWindow(gWindow);
    return 0;
    }

Работает нормально, но когда я минимизирую окно, все ранее нарисованные точки удаляются.Есть ли способ предотвратить это?Я запускаю эту программу в ОС Windows, но не тестировал ее в Linux и использовал Mingw для ее компиляции.

1 Ответ

0 голосов
/ 18 февраля 2019

Вам уже повезло, что ОС не дает вам мусор в буфере кадров по умолчанию после замены буфера.Не полагайтесь на это поведение.

Либо:

  • Перерисуйте все свои точки до сих пор в каждом кадре, либо
  • Нарисуйте точки постепенно до FBO и вставить его в буфер кадров по умолчанию для каждого кадра.
...