1. ホーム
  2. c++

[解決済み】SDLレンダラとは何ですか?

2022-04-18 03:16:11

質問

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ドキュメントやいくつかの本も調べました。しかし、それらはすべて、私がこれらの定義を知っていることを前提としています。

どのように解決するのですか?

SDL_ウィンドウ

SDL_Window は Window 自体に関するすべての情報(サイズ、位置、フル スクリーン、ボーダーなど)を保持する構造体です。


SDL_レンダラ

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_テクスチャとSDL_サーフェス

SDL_Renderer をレンダリングします。 SDL_Texture これは、1つの要素のピクセル情報を格納するものです。これは、新しいバージョンの 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 はソフトウェアレンダリング(CPU経由)であるのに対し SDL_Texture は、ハードウェアレンダリング(GPU経由)を使用しています。


SDL_矩形

SDL で最もシンプルな構造体です。4 つのショートカットだけが含まれています。 x, y で、位置を保持し w, h は、幅と高さを保持する。

ここで重要なのは 0, 0 は、SDLでは左上の角です。そのため、より高い y -の値は低いことを意味し、右下隅の座標は x + w, y + h


SDL2については、私のサイトで詳しく紹介しています。 ブログ