web-dev-qa-db-fra.com

Qu'est-ce qu'un rendu SDL?

Je commence avec SDL2 et rencontre quelques difficultés pour essayer de 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 ils sont liés?

J'ai eu des problèmes avec ceci 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 le wiki de SDL) et la documentation sur SDL Wiki ainsi que certains livres. Mais tous supposent que je connais ces définitions.

91
prcastro

SDL_Window

SDL_Window Est la structure qui contient toutes les informations sur la fenêtre: taille, position, plein écran, bordures, etc.


SDL_Renderer

SDL_Renderer Est une structure qui gère tout le rendu. Il est lié à un SDL_Window Et ne peut donc être rendu qu'à l'intérieur de ce SDL_Window. Il assure également le suivi des paramètres liés au rendu. Il y a plusieurs fonctions importantes liées au SDL_Renderer

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

  • SDL_RenderClear(renderer);
    Ceci 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 restituer un SDL_Texture Et 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 voulez rendre.
    • const SDL_Rect* srcrect, La partie de la texture que vous voulez rendre, NULL si vous voulez rendre toute la texture
    • const SDL_Rect* dstrect)
      Où vous voulez rendre la texture dans la fenêtre. Si la largeur et la hauteur de ce SDL_Rect Est plus petite ou plus grande que les dimensions de la texture elle-même, la texture sera étirée en fonction de ceci SDL_Rect
  • SDL_RenderPresent(renderer);
    Les autres fonctions SDL_Render * dessinent une cible cachée. Cette fonction prendra tout cela et la dessinera dans la fenêtre liée au rendu.

SDL_Textures et SDL_Surface

Le SDL_Renderer Rend SDL_Texture, Qui stocke les informations de pixel d'un élément. C'est la nouvelle version de SDL_Surface Qui est à peu près la même chose. La différence réside principalement dans le fait que SDL_Surface Est juste un struct contenant des informations sur les pixels, tandis que SDL_Texture Est une représentation efficace, spécifique au pilote, de données de pixels.

Vous pouvez convertir une SDL_Surface * en SDL_Texture en utilisant

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

Après cela, le SDL_Surface doit être libéré avec

SDL_FreeSurface( SDL_Surface* surface )

Une autre différence importante est que SDL_Surface Utilise le rendu logiciel (via le processeur) tandis que SDL_Texture Utilise le rendu matériel (via le GPU).


SDL_Rect

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

Il est important de noter que 0, 0 Est le coin supérieur gauche de SDL. Donc, une valeur supérieure y- signifie plus bas, et le coin inférieur droit aura la coordonnée x + w, y + h


Vous pouvez en savoir plus sur SDL2 sur mon blog.

174
olevegard

Penser à SDL_Window en pixels physiques, et SDL_Renderer et un emplacement pour stocker les paramètres/le contexte.

Vous créez donc un ensemble de ressources et les suspendez au moteur de rendu; et ensuite, quand il est prêt, vous indiquez au moteur de rendu de tout assembler et d'envoyer les résultats à la fenêtre.

6
woolstar