태그 보관물: sdl-2

sdl-2

SDL 렌더러 란 무엇입니까? << “SDL_CreateRenderer

나는 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 Documentation과 일부 책도 살펴 보았습니다. 그러나 그들 모두는 내가 이러한 정의를 알고 있다고 가정합니다.



답변

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이며 a를 렌더링하는 데 사용 되며 다음 매개 변수가 있습니다.

    • 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단지 인 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_Rect

SDL에서 가장 간단한 구조체. 네 개의 반바지 만 포함되어 있습니다. x, y위치 w, h를 유지하고 너비와 높이를 유지합니다.

0, 0SDL의 왼쪽 상단 모서리라는 점에 유의하는 것이 중요합니다 . 따라서 더 높은 y값은 더 낮은 것을 의미하고 오른쪽 하단 모서리에는 좌표가 있습니다.x + w, y + h


블로그에서 SDL2에 대해 자세히 알아볼 수 있습니다 .


답변

SDL_Window물리적 픽셀과 SDL_Renderer설정 / 컨텍스트를 저장할 장소 로 생각하십시오 .

따라서 많은 리소스를 만들고 렌더러에 매달아 놓습니다. 그런 다음 준비가되면 렌더러에게 모든 것을 모아 결과를 창으로 보내라고합니다.


답변