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.
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 unSDL_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 ceSDL_Rect
sont plus petites ou plus grandes que les dimensions de la texture elle-même, la texture sera étirée en fonction de ceSDL_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 .
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.