O que é um renderizador SDL?
-
21-12-2019 - |
Pergunta
Estou começando com SDL2 e tendo algumas dificuldades para tentar entender o que é um SDL_Renderer.
O que é?O que isso faz?Qual é a diferença entre SDL_Renderer, SDL_Window, SDL_Surface e SDL_Texture e como eles estão relacionados?
Tive problemas com isso ao tentar entender este código introdutório:
#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;
}
Eu estava usando o tutorial Twinklebear (sugerido no SDL Wiki) e também procurei na documentação do SDL Wiki e em alguns livros.Mas todos eles presumem que conheço essas definições.
Solução
SDL_Janela
SDL_Window
é a estrutura que contém todas as informações sobre a própria janela:tamanho, posição, tela cheia, bordas etc.
SDL_Renderizador
SDL_Renderer
é uma estrutura que lida com toda a renderização.Está vinculado a um SDL_Window
então ele só pode renderizar dentro disso SDL_Window
.Ele também acompanha as configurações relacionadas à renderização.Existem várias funções importantes ligadas ao SDL_Renderer
SDL_SetRenderDrawColor(renderer, r, g, b, a);
Isso define a cor para a qual você limpa a tela (veja abaixo)SDL_RenderClear(renderer);
Isto limpa o alvo de renderização com a cor de desenho definida acimaSDL_RenderCopy(
Esta é provavelmente a função que você mais usará, ela é usada para renderizar umSDL_Texture
e possui os seguintes parâmetros:SDL_Renderer* renderer,
O renderizador que você deseja usar para renderização.SDL_Texture* texture,
A textura que você deseja renderizar.const SDL_Rect* srcrect,
A parte da textura que você deseja renderizar, NULL se quiser renderizar a textura inteiraconst SDL_Rect* dstrect)
Onde você deseja renderizar a textura na janela.Se a largura e a altura desteSDL_Rect
for menor ou maior que as dimensões da própria textura, a textura será esticada de acordo com issoSDL_Rect
SDL_RenderPresent(renderer);
As outras funções SDL_Render* desenham para um alvo oculto.Esta função pegará tudo isso e desenhará na janela vinculada ao renderizador.
SDL_Textures e SDL_Surface
O SDL_Renderer
renderiza SDL_Texture
, que armazena as informações de pixel de um elemento.É a nova versão do SDL_Surface
o que é praticamente o mesmo.A diferença é principalmente que SDL_Surface
é apenas um struct
contendo informações de pixel, enquanto SDL_Texture
é uma representação eficiente e específica do driver de dados de pixel.
Você pode converter um SDL_Surface* em SDL_Texture usando
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
SDL_Surface* surface)
Depois disso, o SDL_Surface deve ser liberado usando
SDL_FreeSurface( SDL_Surface* surface )
Outra diferença importante é que SDL_Surface
usa renderização de software (via CPU) enquanto SDL_Texture
usa renderização de hardware (via GPU).
SDL_Rect
A estrutura mais simples em SDL.Ele contém apenas quatro shorts. x, y
que ocupa o cargo e w, h
que contém largura e altura.
É importante notar que 0, 0
é o canto superior esquerdo no SDL.Então, um mais alto y
-valor significa inferior e o canto inferior direito terá a coordenada x + w, y + h
Você pode ler mais sobre SDL2 no meu blog.
Outras dicas
Imagine SDL_Window
como pixels físicos, e SDL_Renderer
e um local para armazenar configurações/contexto.
Então você cria vários recursos e os pendura no renderizador;e então, quando estiver pronto, você diz ao renderizador para juntar tudo e enviar os resultados para a janela.