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.
SDL_Window
Est la structure qui contient toutes les informations sur la fenêtre: taille, position, plein écran, bordures, etc.
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,
SDL_Texture* texture,
const SDL_Rect* srcrect,
La partie de la texture que vous voulez rendre, NULL si vous voulez rendre toute la textureconst SDL_Rect* dstrect)
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);
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).
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.
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.