Что такое рендерер 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 и некоторые книги. Но все они предполагают, что я знаю эти определения.

82

Решение

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_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_Surface использует программное обеспечение рендеринга (через процессор), в то время как SDL_Texture использует аппаратный рендеринг (через графический процессор).


SDL_Rect

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

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


Вы можете прочитать больше о SDL2 на моем блог.

162

Другие решения

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

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

4

По вопросам рекламы [email protected]