Est-ce que SDL Renderer est inutile si j’utilise opengl pour dessiner?

J’apprends SDL2, mais j’utilise également la bibliothèque imgui qui utilise les appels OpenGL. D’après ce que j’ai lu sur différents blogs en ligne, je ne peux pas mélanger facilement les appels de rendu SDL2 et OpenGL; J’utilise l’un ou l’autre.

La plupart des tutoriels que j’ai lus utilisent le moteur de rendu. Je ne comprends donc pas très bien comment utiliser SDL2 sans le moteur de rendu pour dessiner des primitives ou des images-objects.

Prenons l’exemple suivant: http://lazyfoo.net/tutorials/SDL/11_clip_rendering_and_sprite_sheets/index.php

Il crée le rendu sdl:

gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED ); 

Qu’il utilise ensuite pour restituer des images:

 void LTexture::render( int x, int y, SDL_Rect* clip ) { //Set rendering space and render to screen SDL_Rect renderQuad = { x, y, mWidth, mHeight }; //Set clip rendering dimensions if( clip != NULL ) { renderQuad.w = clip->w; renderQuad.h = clip->h; } //Render to screen SDL_RenderCopy( gRenderer, mTexture, clip, &renderQuad ); } 

Il appelle ensuite son render() pour dessiner des images à partir d’un spritesheet:

 //Clear screen SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF ); SDL_RenderClear( gRenderer ); //Render top left sprite gSpriteSheetTexture.render( 0, 0, &gSpriteClips[ 0 ] ); //Render top right sprite gSpriteSheetTexture.render( SCREEN_WIDTH - gSpriteClips[ 1 ].w, 0, &gSpriteClips[ 1 ] ); //Render bottom left sprite gSpriteSheetTexture.render( 0, SCREEN_HEIGHT - gSpriteClips[ 2 ].h, &gSpriteClips[ 2 ] ); //Render bottom right sprite gSpriteSheetTexture.render( SCREEN_WIDTH - gSpriteClips[ 3 ].w, SCREEN_HEIGHT - gSpriteClips[ 3 ].h, &gSpriteClips[ 3 ] ); //Update screen SDL_RenderPresent( gRenderer ); 

Je comprends ce qui se passe, mais maintenant que je ne peux pas utiliser le rendu sdl, comment puis-je accomplir la même chose? Puis-je utiliser aucune fonction de dessin SDL2 maintenant? Dois-je uniquement utiliser des appels OpenGL bruts et SDL uniquement pour les liaisons au clavier?

En gros, je ne comprends pas comment utiliser SDL2 pour dessiner des objects (comme dans l’exemple de sprite) si je ne peux pas utiliser le rendu SDL Renderer car il semble incompatible avec la bibliothèque gui que j’utilise, qui utilise des appels opengl pour le rendu.

Puis-je utiliser aucune fonction de dessin SDL2 maintenant? Dois-je uniquement utiliser des appels OpenGL bruts et SDL uniquement pour les liaisons au clavier?

Correct.

Pour utiliser directement l’API OpenGL, la fenêtre SDL doit être créée avec l’indicateur SDL_WINDOW_OPENGL , ainsi qu’un nouveau contexte OpenGL pour celle-ci:

 auto window = SDL_CreateWindow("Window name", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN); auto context = SDL_GL_CreateContext(window); 

En cas de succès, il suffirait d’appeler OpenGL comme dans tout autre gestionnaire de contexte. Le même site Web lié à la question fournit des didacticiels sur l’utilisation d’OpenGL avec SDL 2, anciens et modernes . Notez qu’aucun des deux n’implique la création d’un rendu SDL. En fait, son utilisation serait inappropriée, car les deux API sont supposées être mutuellement exclusives: vous devez utiliser l’une ou l’autre. Cette réponse explique rapidement pourquoi vous ne devriez pas les mélanger.

Néanmoins , il existe des moyens d’obtenir la même sortie à partir de certains appels SDLRenderer à l’aide d’OpenGL (car le même moteur de rendu utilise une implémentation OpenGL!), Mais cela dépendra naturellement de la casse. Voulez-vous dessiner un rectangle simple? Les glBegin traditionnelles glBegin et glEnd pourraient suffire. Voulez-vous dessiner un sprite? Vous devrez d’abord l’envoyer à la mémoire du périphérique OpenGL. Une fois que vous connaissez les règles autour d’OpenGL, il est souvent approprié de créer une couche de wrapper appropriée. Si vous souhaitez utiliser des bibliothèques existantes qui s’appuient sur OpenGL, il est préférable de remplacer d’autres procédures de dessin pour utiliser cette API (ou des bibliothèques d’utilitaires telles que GLU).

Notez également que le rendu SDL ne doit pas nécessairement s’appuyer sur OpenGL (il peut utiliser Direct3D sous Windows).

Si j’ai bien compris, vous souhaitez savoir comment afficher sur l’écran SDL sans utiliser les fonctions SDL, vous souhaitez utiliser les fonctions opengl. SDL prend en charge opengl. Pour rendre des éléments avec opengl à l’aide de SDL, vous devez suivre les étapes minimales suivantes: avant de créer la fenêtre, appelez SDL_GL_SetAtsortingbute pour définir les atsortingbuts OpenGL, puis créez la fenêtre avec le drapeau SDL_WINDOW_OPENGL contexte (chaque application en a un) appelant SDL_GL_CreateContext , voir le wiki de SDL pour les fonctions que j’ai mentionnées: CategoryVideo – SDL Wiki

Voici un exemple de code:

 void start(SDL_Window** window, SDL_GLContext* gl){ if(SDL_Init(SDL_INIT_VIDEO) < 0){ throw std::runtime_error(SDL_GetError()); } //set the gl version to be loaded SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); *window = SDL_CreateWindow("Widget Tests", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL); if(*window == nullptr){ throw std::runtime_error(SDL_GetError()); } //create the opengl context *gl = SDL_GL_CreateContext(*window); if(*gl == nullptr){ throw std::runtime_error(SDL_GetError()); } } int main(){ SDL_Window* window; SDL_GLContext gl; ... //init sdl and opengl start(&window, &gl); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glMatrixMode(GL_PROJECTION_MATRIX); glLoadIdentity(); glMatrixMode(GL_MODELVIEW_MATRIX); glLoadIdentity(); glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); while(running){ while(SDL_PollEvent(&event)){ switch(event.type){ ... } } glClear(GL_COLOR_BUFFER_BIT); //... draw calls with opengl SDL_GL_SwapWindow(window);//update the window } }