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


103

У мене починається 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 та деякі книги. Але всі вони припускають, що я знаю ці визначення.

Відповіді:


196

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(
    Це, мабуть, функція, яку ви використовуєте найбільше, вона використовується для візуалізації a 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_Текстури та 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апаратне візуалізація (через GPU).


SDL_Rect

Найпростіша структура в SDL. Він містить лише чотири шорти. x, yяке займає положення і w, hяке займає ширину і висоту.

Важливо зазначити, що 0, 0це верхній лівий кут SDL. Отже, вища yзначення має значення нижчий, а нижній правий кут матиме координатуx + w, y + h


Ви можете прочитати більше про SDL2 в моєму блозі.


1
Отже, що ви, коли ви телефонуєте SDL_RenderPresent, це взяти цього рендеріра з усіма його налаштуваннями та текстурами, які були завантажені на нього, і змусити його передавати цю інформацію у Вікно, до якого він прив'язаний?
prcastro

3
@olevegard, чудова відповідь. Щойно для уточнення різниці між SDL_Texture та SDL_Surface, я підкреслив би, що SDL_Texture надає за допомогою графічного процесора та SDL_Surface використовує програмне перетворення, яке є менш ефективним, але дозволяє вільно маніпулювати інформацією пікселів. Також чудовий блог, я обов’язково прочитаю його :)
Фабіо Пікчі,

Висловлювання "Це очищає ціль візуалізації з кольором малювання, встановленим вище" , я вважаю, є правильним, але я не в змозі зрозуміти фразу "очищає" у заяві. Документ завжди використовує цю фразу. Не могли б ви пояснити, що саме тут означає "ясно" ? Чи означає це "фарба" (сортування) з поточним кольором малювання рендерінга?
Наваз

Чи є якісь причини використовувати SDL_Surfaceбільше SDL_Renderer?
Stevoisiak

Верхня відповідь має деяку неточність, SDL_Renderer може також прив’язати до поверхні, а не лише до вікна. Перевірте посилання: wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro

9

Розгляньте SDL_Windowяк фізичні пікселі SDL_Rendererта місце для зберігання налаштувань / контексту.

Отже, ви створюєте купу ресурсів і вішаєте їх на рендерінг; і тоді, коли він готовий, ви скажете рендерінгу скласти все разом і надіслати результати у вікно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.