Что такое рендерер 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 и некоторые книги. Но все они предполагают, что я знаю эти определения.
2 ответа:
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
The
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использует аппаратный рендеринг (через GPU).
SDL_Rect
самая простая структура в SDL. Он содержит только четыре шорты.
x, yкоторый держит позицию иw, h, который имеет ширину и высоту.важно отметить, что
0, 0- это верхний левый угол в SDL. Так что вышеy-значение означает ниже, а нижний правый угол будет иметь координатуx + w, y + h
вы можете прочитать больше о SDL2 на моем блог.