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

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

Qu'est-ce que c'est? Que faut-il faire? 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 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 tutoriel Twinklebear (suggéré sur le wiki SDL) et je regardais aussi la Documentation du wiki SDL et quelques livres. Mais tous supposent que Je sais que ces définitions.

77
demandé sur Steven Vascellaro 2014-01-09 01:51:26

2 réponses

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_Renderer est une structure qui gère tout le rendu. Il est lié à un SDL_Window donc il ne peut que rendre dans ce SDL_Window. Il garde également une trace 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);
    Cela définit la couleur à 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 rendre un SDL_Texture et a 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 rend la texture entière
    • const SDL_Rect* dstrect)
      Où vous voulez rendre la texture dans la fenêtre. Si la largeur et la hauteur de ce SDL_Rect sont plus petites ou plus grandes que les dimensions de la texture elle-même, la texture sera étirée en fonction de ce SDL_Rect
  • SDL_RenderPresent(renderer);
    Les autres fonctions SDL_Render * dessinent vers une cible cachée. Cette fonction prendra tout cela et le dessinera dans la fenêtre liée au moteur de 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. La différence est principalement que SDL_Surface est juste un struct contenant des informations de pixel, tandis que SDL_Texture est 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, le SDL_Surface doit être libéré en utilisant

SDL_FreeSurface( SDL_Surface* surface )

Un autre important la différence est que SDL_Surface utilise le rendu logiciel (via CPU) tandis que SDL_Texture utilise le rendu matériel (via GPU).


SDL_Rect

La structure la plus simple dans SDL. Il ne contient que quatre courts métrages. {[26] } qui maintient la position et w, h qui maintient la largeur et la hauteur.

Il est important de noter que {[28] } est le coin supérieur gauche dans SDL. Ainsi, une valeur y supérieure signifie inférieure, et le coin inférieur droit aura la coordonnée x + w, y + h


Vous pouvez lire plus A propos de SDL2 sur mon blog .

157
répondu olevegard 2018-08-17 18:37:38

Penser SDL_Window physiques pixels, et SDL_Renderer et un endroit pour stocker les paramètres/contexte.

Donc, vous créez un tas de ressources, et les suspendez du moteur de rendu; et puis quand il est prêt, vous dites au moteur de rendu de tout mettre ensemble et d'envoyer les résultats à la fenêtre.

4
répondu woolstar 2014-01-08 21:55:47