Qu'est-ce que SDL moteur de rendu?
-
21-12-2019 - |
Question
Je commence avec SDL2 et ayant peu de mal à essayer de comprendre ce qu'est un SDL_Renderer est.
Quel est-il?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 l'introduction de ce code:
#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'ai été en utilisant Twinklebear tutoriel (proposé sur SDL Wiki), s'est penché également sur la SDL Wiki de la Documentation et des livres.Mais tous assume que je sais que ces définitions.
La solution
SDL_Window
SDL_Window
est la structure qui contient toutes les infos à propos de la Fenêtre elle-même:la taille, la position, en plein écran, de frontières, etc.
SDL_Renderer
SDL_Renderer
est une structure qui gère l'ensemble de rendu.Il est attaché à un SDL_Window
donc, il ne peut que rendre l'intérieur de cette SDL_Window
.Il permet également de suivre les paramètres liés à la prestation.Il y a plusieurs fonctions importantes liées à la SDL_Renderer
SDL_SetRenderDrawColor(renderer, r, g, b, a);
Ceci définit la couleur claire de l'écran ( voir ci-dessous )SDL_RenderClear(renderer);
Cela désactive le rendu de la cible avec le tirage couleur définie ci-dessusSDL_RenderCopy(
C'est probablement la fonction que vous utiliserez le plus, il est utilisé pour effectuer le rendu d'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 souhaitez rendre.const SDL_Rect* srcrect,
La partie de la texture que vous souhaitez rendre, NULL si vous voulez rendre l'intégralité de la textureconst SDL_Rect* dstrect)
Où vous voulez rendre la texture dans la fenêtre.Si la largeur et la hauteur de ceSDL_Rect
est plus petit ou plus grand que les dimensions de la texture elle-même, la texture sera étirée selon cetteSDL_Rect
SDL_RenderPresent(renderer);
Les autres SDL_Render* fonctions attire une cible cachée.Cette fonction prend tout cela, et de dessiner dans la fenêtre liée au moteur de rendu.
SDL_Textures et SDL_Surface
L' SDL_Renderer
rend SDL_Texture
, qui stocke les informations de pixel d'un élément.C'est la nouvelle version de SDL_Surface
ce qui est bien le même.La différence est surtout que SDL_Surface
est juste un struct
contenant des informations de pixel, tandis que SDL_Texture
est efficace, un pilote spécifique à la représentation de données de pixels.
Vous pouvez convertir une SDL_Surface* pour SDL_Texture à l'aide de
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
SDL_Surface* surface)
Après cela, le SDL_Surface doit être libérée à l'aide
SDL_FreeSurface( SDL_Surface* surface )
Une autre différence importante est que SDL_Surface
utilise un logiciel de rendu (par CPU), tandis que SDL_Texture
utilise le matériel de rendu (via GPU).
SDL_Rect
Le plus simple struct en SDL.Il ne contient que quatre courts métrages. x, y
qui détient la position et w, h
qui détient la largeur et la hauteur.
Il est important de noter que 0, 0
est le coin supérieur gauche de la SDL.Ainsi, un plus y
-la valeur est basse, et le coin inférieur droit aura les coordonnées x + w, y + h
Vous pouvez en lire plus à propos de SDL2 sur mon blog.
Autres conseils
Pensez SDL_Window
physique pixels, et SDL_Renderer
et un endroit pour stocker les paramètres/contexte.
Ainsi, vous créez un tas de ressources, et de l'accrocher à l'extérieur de la fonctionnalité de rendu;et puis lors de son prêt, vous dites convertisseur de mettre tout cela ensemble et d'envoyer les résultats à la fenêtre.