Cos'è un rendering SDL?
-
21-12-2019 - |
Domanda
Sto iniziando con SDL2 e avendo qualche problema cercando di capire cosa è un SDL_Renderer.
Che cos'è?Che cosa fa?Qual è la differenza tra SDL_RENDERER, SDL_WINDOW, SDL_SURFACE e SDL_Texture e come sono correlati?
Ho avuto problemi con questo quando cerca di capire questo codice introduttivo:
#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;
}
.
Stavo usando TwinkleBear Tutorial (suggerito su SDL Wiki) e ha guardato anche sulla documentazione Wiki SDL e alcuni libri.Ma tutti assumono che conosco queste definizioni.
Soluzione
sdl_window
SDL_Window
è la struttura che contiene tutte le informazioni sulla finestra stessa: dimensioni, posizione, schermo intero, bordi ecc.
.
SDL_RENDERER
SDL_Renderer
è una struttura che gestisce tutto il rendering. È legato a un SDL_Window
in modo da poter solo rendere solo all'interno di quel SDL_Window
. Tiene anche traccia delle impostazioni relative al rendering. Ci sono diverse funzioni importanti legate al SDL_Renderer
- .
-
SDL_SetRenderDrawColor(renderer, r, g, b, a);
Questo imposta il colore che cancella lo schermo su (vedi sotto) -
SDL_RenderClear(renderer);
Questo cancella il bersaglio di rendering con il set di colori di disegno sopra -
SDL_RenderCopy(
Questa è probabilmente la funzione che utilizzerai di più, è usato per il rendering di unSDL_Texture
e ha i seguenti parametri:- .
-
SDL_Renderer* renderer,
Il rendering che si desidera utilizzare per il rendering.
-
-
SDL_Texture* texture,
La consistenza che vuoi rendere. -
const SDL_Rect* srcrect,
La parte della consistenza che vuoi rendere, null se vuoi rendere l'intera texture -
const SDL_Rect* dstrect)
Dove vuoi rendere la trama nella finestra. Se la larghezza e l'altezza di questoSDL_Rect
sono più piccole o più piccole delle dimensioni della trama stessa, la trama verrà allungata secondo questoSDL_Rect
SDL_RenderPresent(renderer);
Le altre funzioni SDL_Render * si avvicinano a un bersaglio nascosto. Questa funzione prenderà tutto e disegneràla nella finestra legata al rendering.
.
sdl_textures e sdl_surface
Il SDL_Renderer
rendering generacodictagcode, che memorizza le informazioni pixel di un elemento. È la nuova versione di SDL_Texture
che è lo stesso. La differenza è per lo più che SDL_Surface
è solo un SDL_Surface
contenente informazioni pixel, mentre struct
è una rappresentazione efficiente, specifica per il conducente dei dati dei pixel.
È possibile convertire un SDL_Surface * su SDL_Texture utilizzando
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
SDL_Surface* surface)
.
Dopo questo, la SDL_Surface dovrebbe essere liberata usando
SDL_FreeSurface( SDL_Surface* surface )
.
Un'altra differenza importante è che SDL_Texture
utilizza il rendering del software (tramite CPU) mentre SDL_Surface
utilizza il rendering hardware (tramite GPU).
.
sdl_rect
La struttura più semplice in SDL. Contiene solo quattro pantaloncini. SDL_Texture
che contiene la posizione e il x, y
che contiene larghezza e altezza.
È importante notare che w, h
è l'angolo in alto a sinistra in SDL. Quindi un valore più alto 0, 0
significa inferiore e l'angolo in basso a destra avrà la coordinata y
.
Puoi leggere di più su SDL2 sul mio Blog.
Altri suggerimenti
Pensa a SDL_Window
come pixel fisici e SDL_Renderer
e un luogo per archiviare Impostazioni / contesto.
Quindi crei un gruppo di risorse e appendili fuori dal rendering;E poi quando è pronto, dici a renderere di mettere tutto insieme e invia i risultati alla finestra.