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.

Foi útil?

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 acima

  • SDL_RenderCopy(
    Esta é provavelmente a função que você mais usará, ela é usada para renderizar um SDL_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 inteira
    • const SDL_Rect* dstrect)
      Onde você deseja renderizar a textura na janela.Se a largura e a altura deste SDL_Rect for menor ou maior que as dimensões da própria textura, a textura será esticada de acordo com isso SDL_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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top