質問

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_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_RendererSDL_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 )
.

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


sdl_rect

SDLの最も簡単な構造体。それは4つの短絡しか含まれていません。幅と高さを保持する位置とx, yを保持するw, h

0, 0がSDLの左上隅になっていることに注意することが重要です。したがって、より高いy値は低く、右下隅に座標x + w, y + h

があります。


あなたは私のブログにsdl2についてもっと読むことができます。

他のヒント

SDL_Windowを物理的なピクセルとして考えると、SDL_Rendererと設定/コンテキストを保存する場所です。

だからあなたは束の束を作成し、それらをレンダラーから掛けてください。それからそれが準備ができたら、レンダラーにそれをまとめるように言うように言い、結果をウィンドウに送信します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top