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

回答:


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(
    これはおそらく最もよく使用する関数です。レンダリングに使用され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だけであり、ピクセルデータの効率的なドライバー固有の表現であるということです。structSDL_Texture

SDL_Surface *をSDL_Textureに変換することができます

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

この後、SDL_Surfaceを使用して解放する必要があります

SDL_FreeSurface( SDL_Surface* surface )

もう1つの重要な違いは、ハードウェアレンダリング(GPU経由SDL_Surface)をSDL_Texture使用しながらソフトウェアレンダリング(CPU経由)を使用することです。


SDL_Rect

SDLで最も単純な構造体。ショーツは4つしかありません。x, y位置とw, h幅と高さを保持します。

これ0, 0はSDLの左上隅であることに注意してください。したがって、y-value が高いほど低くなり、右下隅が座標になります。x + w, y + h


SDL2の詳細については、私のブログを参照してください。


1
では、SDL_RenderPresentを呼び出すときに、レンダラーにすべての設定とテクスチャをアップロードし、関連付けられているウィンドウにこの情報をレンダリングするようにしますか?
prcastro 2014年

3
@olevegard、素晴らしい答え。SDL_TextureとSDL_Surfaceの違いを明確にするために、SDL_TextureはGPUを使用してレンダリングし、SDL_Surfaceはソフトウェアの再利用を使用することを強調します。これは効率が低下しますが、ピクセル情報を自由に操作できます。また、素晴らしいブログ、私はきっとそれを読みます:)
Fabio Picchi

「これにより、上で設定した描画色でレンダリングターゲットがクリアされます」という記述は正しいと思いますが、ステートメント内の「クリア」というフレーズは理解できません。DOCは、常にこの句を使用しています。ここで正確に「明確」とはどういう意味か説明していただけますか?それは、レンダラーの現在の描画色で「ペイント」することを意味しますか?
Nawaz

SDL_Surface以上使用する理由はありますSDL_Rendererか?
Stevoisiak 2018

上の回答には不正確な点がいくつかあります。SDL_Rendererはウィンドウだけでなく、サーフェスにも関連付けることができます。リンクを確認してください:wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro

9

SDL_Window物理的なピクセル、およびSDL_Renderer設定/コンテキストを保存する場所と考えてください。

したがって、一連のリソースを作成し、それらをレンダラーから切り離します。そして、準備ができたら、レンダラーにすべてをまとめて結果をウィンドウに送信するように指示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.