Что такое рендер SDL?

Я начинаю с SDL2 и испытываю некоторые проблемы с попыткой понять, что такое SDL_Renderer.

Что это? Что оно делает? В чем разница между SDL_Renderer, SDL_Window, SDL_Surface и SDL_Texture и тем, как они связаны?

У меня были проблемы с этим, пытаясь понять этот вводный код:

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

Я использовал учебник Twinklebear (предложенный на SDL Wiki), а также посмотрел документацию SDL Wiki и некоторые книги. Но все они предполагают, что я знаю эти определения.

Ответ 1

SDL_Window

SDL_Window - это структура, которая содержит всю информацию о самом окне: размер, положение, полный экран, границы и т.д.


SDL_Renderer

SDL_Renderer - это структура, которая обрабатывает весь рендеринг. Он привязан к SDL_Window, поэтому он может отображать только внутри SDL_Window. Он также отслеживает настройки, связанные с рендерингом. Существует несколько важных функций, связанных с SDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
     Это устанавливает цвет, на который вы очищаете экран (см. Ниже).

  • SDL_RenderClear(renderer);
    Это очищает цель рендеринга с установленным выше уровнем рисования

  • SDL_RenderCopy(
    Вероятно, это функция, которую вы будете использовать больше всего, она используется для рендеринга SDL_Texture и имеет следующие параметры:

    • SDL_Renderer* renderer,
      Средство рендеринга, которое вы хотите использовать для рендеринга.
    • SDL_Texture* texture,
      Текстуру, которую вы хотите визуализировать.
    • const SDL_Rect* srcrect, Часть текстуры, которую вы хотите визуализировать, NULL, если вы хотите отобразить всю текстуру
    • const SDL_Rect* dstrect)
      Где вы хотите визуализировать текстуру в окне. Если ширина и высота этого SDL_Rect меньше или больше размеров самой текстуры, текстура будет растянута в соответствии с этим SDL_Rect

  • SDL_RenderPresent(renderer);
    Другие функции SDL_Render * обращаются к скрытой цели. Эти функции возьмут все это и нарисуют в окне, связанном с рендерером.

SDL_Textures и SDL_Surface

SDL_Renderer, отображает SDL_Texture. SDL_Texture - это информация о пикселях одного элемента. Это новая версия SDL_Surface, которая почти такая же. Разница в основном состоит в том, что SDL_Surface представляет собой всего лишь struct, содержащую информацию о пикселях, тогда как SDL_Texture является эффективным, специфичным для драйвера представлением данных пикселей.

Вы можете преобразовать SDL_Surface * в SDL_Texture, используя

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

После этого SDL_Surface следует освободить, используя

SDL_FreeSurface( SDL_Surface* surface )

SDL_Rect

Простейшая структура в SDL. Он содержит только четыре шорты. x, y, который удерживает положение и w, h, который имеет ширину и высоту.

Важно отметить, что 0, 0 - верхний левый угол в SDL. Таким образом, более высокое значение y означает меньшее значение, а нижний правый угол будет иметь координату x + w, y + h


Подробнее о SDL2 можно прочитать в блоге .

Ответ 2

Подумайте о SDL_Window как о физических пикселях и SDL_Renderer и о месте хранения настроек/контекста.

Итак, вы создаете кучу ресурсов и отключаете их от рендеринга; а затем, когда он готов, вы указываете рендереру, чтобы собрать все это вместе и отправить результаты в окно.