私は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_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,
レンダリングするテクスチャの部分。テクスチャ全体をレンダリングする場合はNULLconst SDL_Rect* dstrect)
SDL_Rect
の幅と高さがテクスチャ自体の寸法よりも小さいか大きい場合、テクスチャはこのSDL_Rect
に従って引き伸ばされます。SDL_RenderPresent(renderer);
SDL_Renderer
は、1つの要素のピクセル情報を格納する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 )
もう1つの重要な違いは、SDL_Surface
がソフトウェアレンダリング(CPU経由)を使用し、SDL_Texture
がハードウェアレンダリング(GPU経由)を使用することです。
SDLで最も単純な構造体。ショーツは4つだけです。 x, y
は位置を保持し、w, h
は幅と高さを保持します。
0, 0
はSDLの左上隅であることに注意することが重要です。したがって、y
- valueが高いほど低いことを意味し、右下隅の座標はx + w, y + h
になります
SDL2の詳細については、私の ブログ をご覧ください。
SDL_Window
を物理的なピクセル、SDL_Renderer
および設定/コンテキストを保存する場所と考えてください。
したがって、大量のリソースを作成し、それらをレンダラーから切り離します。そして準備ができたら、レンダラーにすべてをまとめて結果をウィンドウに送信するように指示します。