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

답변:


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이며 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에 대해 자세히 알아볼 수 있습니다 .


1
SDL_RenderPresent를 호출 할 때 업로드 된 모든 설정 및 텍스처와 함께 해당 렌더러를 가져 와서 연결된 창에서이 정보를 렌더링하도록하는 것이 무엇입니까?
prcastro 2014 년

3
@olevegard, 훌륭한 대답입니다. SDL_Texture와 SDL_Surface의 차이점을 명확히하기 위해 SDL_Texture는 GPU를 사용하여 렌더링하고 SDL_Surface는 소프트웨어 재조정을 사용하므로 덜 효율적이지만 픽셀 정보를 자유롭게 조작 할 수 있습니다. 또한, 좋은 블로그, 나는 확실히 :) 그것을 읽을 것이다
파비오 Picchi에게

"이것은 위에 설정된 그리기 색상으로 렌더링 대상을 지 웁니다 . " 라는 문장 은 정확하다고 생각하지만 문장에서 "clears"라는 문구를 이해할 수 없습니다. 문서는 항상이 문구를 사용합니다. 여기서 "명확한"이 정확히 무엇을 의미 하는지 설명해 주 시겠습니까? 렌더러의 현재 그리기 색상으로 "페인트"(일종)를 의미합니까?
Nawaz

사용하는 어떤 이유가 SDL_Surface이상은 SDL_Renderer?
Stevoisiak

최상위 답변에는 약간의 부정확성이 있습니다. SDL_Renderer는 창뿐만 아니라 표면에도 연결할 수 있습니다. 링크를 확인하십시오. wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro

9

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.