Problème création du contexte

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Problème plus ou moins résolu, voir 2ème post

Je vous contacte pour obtenir un point de vu extérieur :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
lp_wnd->wnd = SDL_CreateWindow("",
            SDL_WINDOWPOS_CENTERED, 
            SDL_WINDOWPOS_CENTERED, 
            0, 0,
            SDL_WINDOW_OPENGL
        );

        if (lp_wnd->wnd) {
            lp_wnd->id = SDL_GetWindowID(lp_wnd->wnd);
            lp_out->context = SDL_GL_CreateContext(lp_wnd->wnd);
#ifdef PRISM_SYSTEM_WINDOWS
            glewExperimental = GL_TRUE; 
#endif
            SDL_GL_MakeCurrent(lp_wnd->wnd, lp_out->context);

            if (lp_out->context
#ifdef PRISM_SYSTEM_WINDOWS
                && glewInit() == GLEW_OK
#endif          
                && Pr_Connect(Pr_WindowPainted((Pr_WindowRef)lp_wnd), lp_wnd, s_Pr_RenderPresent_Slot)  
                && Pr_Connect(Pr_WindowUpdated((Pr_WindowRef)lp_wnd), lp_wnd, s_Pr_ActivateContext_Slot) 
            ) {
                glClearColor(1.f, 1.f, 1.f, 1.f);
                glClear(GL_COLOR_BUFFER_BIT);
                SDL_GL_SwapWindow(lp_wnd->wnd);
                lp_out->window = (Pr_Window *)lp_wnd;
                s_Pr_InitTransformable(lp_out);
                return lp_out;

Alors ça peut paraître fouilli en effet, mais même après suivi au debug Visual Studio, je ne comprends pas pourquoi la fenêtre créée ici n'a pas un fond blanc (voir glClearColor()…), mais noir. Tout noir ? Non, un mystérieux rectangle blanc (toujours blanc, même en RVB : 1.f 0.f 1.f par exemple) en haut à gauche du display.

Evidemment lors des testes tout se passe bien et le pointeur lp_out est retourné (adresse valide).

J'ai d'autre part testé les appels OGL dans une application minimaliste, et le problème disparait…

Merci d'avance

PS: Si il y a des portions sombres dans le code n'hésitez pas à demander mes lumières

Édité par NeDKaM

NULL

+0 -0
Auteur du sujet

Je me sens bête, je viens de trouver : c'est le fait de redimenssioner la fenêtre avec SDL_SetWindowSize() après coup qui à l'air de pertuber le tout…

Comment régler le problème ?

NULL

+0 -0
Staff

Est ce que tu ne devrais pas refaire le dessin à chaque rafraîchissement, c'est à dire à chaque frame mais aussi lorsque la fenêtre est redimensionné ? Ajoute une gestion à l'événement et refait ton dessin quand il est déclenché. Techniquement tu dois le refaire dès qu'on te le demande. Tu peux avoir a le refaire par exemple aussi quand une fenêtre passe par dessus la tienne.

+0 -0
Auteur du sujet

Effectivement c'est ce qui vient en preimer lieu à l'esprit mais :

1
2
3
4
5
6
7
    ...
    && Pr_Connect(Pr_WindowUpdated((Pr_WindowRef)lp_wnd), lp_wnd, s_Pr_ActivateContext_Slot) 
    && Pr_Connect(Pr_WindowSizeChanged((Pr_WindowRef)lp_wnd), lp_wnd, s_Pr_Clear_Slot) /* NEW */
    ) {
          glClearColor(1.f, 1.f, 1.f, 1.f);
          glClear(GL_COLOR_BUFFER_BIT);
          ...

Avec :

1
2
3
4
5
6
7
8
9
static void s_Pr_Clear_Slot(void * ap_obj, va_list ap_args)
{
    Pr_RenderingWindow * lp_wnd;

    if (!ap_obj) return;

    lp_wnd = ap_obj;
    Pr_ClearRndTarget(&lp_wnd->renderTarget, NULL);
}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
void Pr_ClearRndTarget(Pr_RenderingTarget * ap_target, Pr_ColorRef ap_color)
{
    if (!ap_target) return;

    //s_Pr_ApplyTexture(ap_target,NULL);

    if (ap_color) {
        glClearColor(ap_color->r / 255.f, 
            ap_color->g / 255.f, 
            ap_color->b / 255.f, 
            ap_color->a / 255.f
        );
    } else {
        glClearColor(1.f,1.f,1.f,1.f);
    }

    glClear(GL_COLOR_BUFFER_BIT);
}

Naturellement le signal est envoyé quand on redimensionne la fenêtre (toujours suivi au debug VS, l'intégralité du code est executé).

1
2
3
4
5
6
7
8
void Pr_SetWindowSize(Pr_Window * ap_wnd, unsigned int a_w, unsigned int a_h)
{
    if (!ap_wnd) return;

    SDL_SetWindowSize(ap_wnd->wnd, a_w, a_h);

    Pr_Emit(Pr_WindowSizeChanged(ap_wnd), a_w, a_h);
}

c'est à dire à chaque frame

Inutile pour l'instant, j'ai volontairement supprimé les slots de mis à jour en temps réel pour y voir plus clair.

Techniquement tu dois le refaire dès qu'on te le demande. Tu peux avoir a le refaire par exemple aussi quand une fenêtre passe par dessus la tienne.

En fait le problème est là : que dois faire et quand ? La doc SDL2 est assez peu fournie sur l'utilisation d'OGL (normal, c'est la v2, mais bref), et je n'arrive pas à avoir la confirmation si SDL met à jour elle-même le Renderer GL (SDL_SetWindowSize() par exemple) ou si je dois faire des appels spécifiques par dessus (glViewport() ?)…

NULL

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte