¿Qué es un renderizador SDL?

103

Estoy empezando con SDL2 y tengo problemas para entender qué es un SDL_Renderer.

¿Qué es? ¿Qué hace? ¿Cuál es la diferencia entre SDL_Renderer, SDL_Window, SDL_Surface y SDL_Texture y cómo se relacionan?

Tuve problemas con esto al intentar comprender este código introductorio:

#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;
}

Estaba usando el tutorial de Twinklebear (sugerido en SDL Wiki) y también busqué en SDL Wiki Documentation y algunos libros. Pero todos suponen que conozco estas definiciones.

prcastro
fuente

Respuestas:

196

SDL_Window

SDL_Window es la estructura que contiene toda la información sobre la ventana en sí: tamaño, posición, pantalla completa, bordes, etc.


SDL_Renderer

SDL_Rendereres una estructura que maneja todo el renderizado. Está vinculado a a, SDL_Windowpor lo que solo puede renderizarse dentro de eso SDL_Window. También realiza un seguimiento de la configuración relacionada con la representación. Hay varias funciones importantes vinculadas a laSDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Esto establece el color al que se borra la pantalla (ver más abajo)

  • SDL_RenderClear(renderer);
    Esto borra el objetivo de renderizado con el color de dibujo establecido arriba

  • SDL_RenderCopy(
    Esta es probablemente la función que más usará, se usa para renderizar ay SDL_Texturetiene los siguientes parámetros:

    • SDL_Renderer* renderer,
      El renderizador que desea utilizar para renderizar.
    • SDL_Texture* texture,
      La textura que desea renderizar.
    • const SDL_Rect* srcrect, La parte de la textura que desea renderizar, NULL si desea renderizar la textura completa
    • const SDL_Rect* dstrect)
      Dónde desea renderizar la textura en la ventana. Si el ancho y la altura de este SDL_Rectes menor o mayor que las dimensiones de la textura en sí, la textura se estirará de acuerdo con esteSDL_Rect
  • SDL_RenderPresent(renderer);
    Las otras funciones de SDL_Render * se dirigen a un objetivo oculto. Esta función tomará todo eso y lo dibujará en la ventana vinculada al renderizador.

SDL_Texture y SDL_Surface

Los SDL_Rendererrenders SDL_Texture, que almacenan la información de píxeles de un elemento. Es la nueva versión de la SDL_Surfacecual es muy parecida. La diferencia es principalmente que SDL_Surfacees solo una structinformación de píxeles que contiene, mientras que SDL_Texturees una representación eficiente y específica del controlador de datos de píxeles.

Puede convertir una SDL_Surface * a SDL_Texture usando

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

Después de esto, SDL_Surface debe liberarse usando

SDL_FreeSurface( SDL_Surface* surface )

Otra diferencia importante es que SDL_Surfaceusa renderizado de software (a través de CPU) mientras que SDL_Textureusa renderizado de hardware (vía GPU).


SDL_Rect

La estructura más simple de SDL. Contiene solo cuatro cortos. x, yque mantiene la posición y w, hque mantiene la anchura y la altura.

Es importante tener en cuenta que 0, 0es la esquina superior izquierda en SDL. Entonces, un yvalor más alto significa más bajo, y la esquina inferior derecha tendrá la coordenadax + w, y + h


Puede leer más sobre SDL2 en mi blog.

Olevegard
fuente
1
Entonces, cuando llamas a SDL_RenderPresent, ¿tomas ese renderizador con toda su configuración y texturas que se cargaron en él y lo haces renderizar esta información en la ventana a la que está vinculado?
prcastro
3
@olevegard, gran respuesta. Solo para aclarar la diferencia entre SDL_Texture y SDL_Surface, quisiera enfatizar que SDL_Texture se renderiza usando la GPU y SDL_Surface usa la reordenación de software, que es menos eficiente pero le permite manipular libremente la información de píxeles. Además, gran blog, seguramente lo leeré :)
Fabio Picchi
La declaración "Esto borra el objetivo de renderizado con el color de dibujo establecido arriba" , creo, es correcta, pero no puedo entender la frase "limpia" en la declaración. El doctor siempre usa esta frase. ¿Podría explicar qué significa exactamente "claro" aquí? ¿Significa "pintar" (más o menos) con el color de dibujo actual del renderizador?
Nawaz
¿Hay alguna razón para usar SDL_Surfacemás SDL_Renderer?
Stevoisiak
La respuesta principal tiene cierta inexactitud, SDL_Renderer también se puede vincular a la superficie, no solo a la ventana, verifique el enlace: wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro
9

Piense SDL_Windowen píxeles físicos SDL_Renderery un lugar para almacenar configuraciones / contexto.

Así que crea un montón de recursos y los cuelga del renderizador; y luego, cuando esté listo, le dice al renderizador que lo junte todo y envíe los resultados a la ventana.

Woolstar
fuente