Qu'est-ce qu'un moteur de rendu SDL?

103

Je commence avec SDL2 et j'ai du mal à comprendre ce qu'est un SDL_Renderer.

Qu'Est-ce que c'est? Qu'est ce que ça fait? Quelle est la différence entre SDL_Renderer, SDL_Window, SDL_Surface et SDL_Texture et comment sont-ils liés?

J'ai eu des problèmes avec cela en essayant de comprendre ce code d'introduction:

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

int main()
{
    /* Starting SDL */
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Window */
    SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if (window == nullptr) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Render */
    SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (render == nullptr) {
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Load bitmap image */
    SDL_Surface *bmp = SDL_LoadBMP("./Tutorial/res/Lesson1/hello.bmp");
    if (bmp == nullptr) {
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Upload surface to render, and then, free the surface */
    SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);
    SDL_FreeSurface(bmp);
    if (texture == nullptr){
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Draw the render on window */
    SDL_RenderClear(render); // Fill render with color
    SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into render
    SDL_RenderPresent(render); // Show render on window

    /* Wait 2 seconds */
    SDL_Delay(5000);

    /* Free all objects*/
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);

    /* Quit program */
    SDL_Quit();
    return 0;
}

J'utilisais le didacticiel Twinklebear (suggéré sur SDL Wiki) et j'ai également consulté la documentation SDL Wiki et quelques livres. Mais tous supposent que je connais ces définitions.

prcastro
la source

Réponses:

196

SDL_Window

SDL_Window est la structure qui contient toutes les informations sur la fenêtre elle-même: taille, position, plein écran, bordures, etc.


SDL_Renderer

SDL_Rendererest une structure qui gère tout le rendu. Il est lié à un, SDL_Windowdonc il ne peut être rendu qu'à l'intérieur de celui-ci SDL_Window. Il assure également le suivi des paramètres liés au rendu. Il existe plusieurs fonctions importantes liées auSDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Cela définit la couleur sur laquelle vous effacez l'écran (voir ci-dessous)

  • SDL_RenderClear(renderer);
    Cela efface la cible de rendu avec la couleur de dessin définie ci-dessus

  • SDL_RenderCopy(
    C'est probablement la fonction que vous utiliserez le plus, elle est utilisée pour le rendu de a SDL_Textureet possède les paramètres suivants:

    • SDL_Renderer* renderer,
      Le moteur de rendu que vous souhaitez utiliser pour le rendu.
    • SDL_Texture* texture,
      La texture que vous souhaitez rendre.
    • const SDL_Rect* srcrect, La partie de la texture que vous voulez rendre, NULL si vous voulez rendre la texture entière
    • const SDL_Rect* dstrect)
      Où vous souhaitez rendre la texture dans la fenêtre. Si la largeur et la hauteur de celui-ci SDL_Rectsont plus petites ou plus grandes que les dimensions de la texture elle-même, la texture sera étirée en fonction de celaSDL_Rect
  • SDL_RenderPresent(renderer);
    Les autres fonctions SDL_Render * dessinent vers une cible masquée. Cette fonction prendra tout cela et le dessinera dans la fenêtre liée au rendu.

SDL_Textures et SDL_Surface

Les SDL_Rendererrendus SDL_Texture, qui stockent les informations de pixel d'un élément. C'est la nouvelle version SDL_Surfacequi est sensiblement la même. La différence réside principalement dans le fait qu'il ne SDL_Surfaces'agit que d'une structinformation de pixel contenant, alors qu'il SDL_Textures'agit d'une représentation efficace et spécifique au pilote des données de pixel.

Vous pouvez convertir une SDL_Surface * en SDL_Texture en utilisant

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

Après cela, la SDL_Surface doit être libérée en utilisant

SDL_FreeSurface( SDL_Surface* surface )

Une autre différence importante est qu'il SDL_Surfaceutilise le rendu logiciel (via CPU) tout en SDL_Textureutilisant le rendu matériel (via GPU).


SDL_Rect

La structure la plus simple de SDL. Il ne contient que quatre courts métrages. x, yqui tient la position et w, hqui tient la largeur et la hauteur.

Il est important de noter qu'il 0, 0s'agit du coin supérieur gauche de SDL. Ainsi, une valeur plus élevée ysignifie une valeur inférieure, et le coin inférieur droit aura la coordonnéex + w, y + h


Vous pouvez en savoir plus sur SDL2 sur mon blog.

olegment
la source
1
Donc ce que vous quand vous appelez SDL_RenderPresent est de prendre ce moteur de rendu avec tous ses paramètres et textures qui y ont été téléchargés et de lui faire rendre ces informations sur la fenêtre à laquelle il est lié?
prcastro
3
@oleec, excellente réponse. Juste pour clarifier la différence entre SDL_Texture et SDL_Surface, je tiens à souligner que SDL_Texture rend en utilisant le GPU et SDL_Surface utilise le redering logiciel, qui est moins efficace mais vous permet de manipuler librement les informations de pixel. Aussi, super blog, je vais sûrement le lire :)
Fabio Picchi
L'instruction "Cela efface la cible de rendu avec la couleur de dessin définie ci-dessus" , je crois, est correcte mais je ne peux pas comprendre l'expression "efface" dans l'instruction. Le doc utilise toujours cette phrase. Pouvez-vous expliquer ce que signifie exactement «clair» ici? Cela signifie-t-il "peindre" (en quelque sorte) avec la couleur de dessin actuelle du moteur de rendu?
Nawaz
Y a-t-il une raison d'utiliser SDL_Surfaceover SDL_Renderer?
Stevoisiak
La réponse principale a une certaine inexactitude, SDL_Renderer peut également être lié à la surface, pas seulement à la fenêtre, veuillez vérifier le lien: wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro
9

Pensez SDL_Windowà des pixels physiques SDL_Rendereret à un endroit pour stocker les paramètres / le contexte.

Vous créez donc un tas de ressources et vous les suspendez du moteur de rendu; et quand c'est prêt, vous dites au moteur de rendu de tout rassembler et d'envoyer les résultats à la fenêtre.

Woolstar
la source