Search
Duplicate
🍏

SDL 2.0 을 알아보자 (6탄) - Texture 이미지 출력하기

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Graphics
Scrap
태그
9 more properties
이전시간에 Surface 를 이용하여 이미지를 출력하는 방법을 알아봤다.
이번에는 Texture 를 이용하여 이미지를 출력하는 방법을 알아보자
이미지를 바로 Texture 로 불러오지는 못하고, Surface 로 이미지를 불러오고,
Surface 를 Texture 로 변경하여 쓴다
함수를 하나씩 알아보면서 확인해보자.

사전 준비

Texture 는 렌더러가 렌더링하기 때문에, 이번에는 다시 렌더러가 필요합니다.
따라서 SDL_CreateRendererIMG_Init 로 초기화를 진행 합니다.
이전과 다르게 SDL_GetWindowSurface 는 필요하지 않습니다.
(자세한 코드는 제일 아래에 있습니다.)

이미지 불러오기

이전에서 썼던 IMG_Load 를 사용하여 이미지를 Surface 로 가져옵니다.
가져온 Surface 를 Texture 로 변환할것이기 때문에 따로 SDL_ConvertSurface 로 최적화 하지 않습니다.

SDL_CreateTextureFromSurface

새로운 Texture 를 주어진 Surface 로 만듭니다.

function

SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface);
C
복사

parameters

rederer : 렌더링할 렌더러
surface : Surface

return value

the created texture or NULL on failure

example

texture = SDL_CreateTextureFromSurface(renderer, surface); if (texture == NULL){ printf("unable to create texture.\n"); } SDL_FreeSurface(surface);
C
복사

이미지 출력하기

Texture 를 출력합니다.

SDL_RenderClear

전체 렌더링 타겟을 비웁니다. (화면을 비웁니다.)

function

int SDLCALL SDL_RenderClear(SDL_Renderer * renderer);
C
복사

parameters

renderer : 렌더링할 렌더러

return value

0 on success or a negative error code on failure

example

SDL_RenderClear(renderer);
C
복사

SDL_RenderCopy

function

int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect);
C
복사

parameters

renderer : 렌더링할 렌더러
texture : 출력될 텍스쳐
srcrect : 출력될 텍스쳐에서 출력될 텍스쳐 부분
dstrect : 출력될 화면 부분

return value

0 on success or a negative error code on failure

example

SDL_Rect src; SDL_Rect dst; src.x = 0; src.y = 0; SDL_QueryTexture(texture, NULL, NULL, &src.w, &src.h); dst.x = x; dst.y = y; dst.w = src.w; dst.h = src.h; SDL_RenderCopy(renderer, texture, NULL, &dst);
C
복사
https://m.blog.naver.com/PostView.naver?blogId=pjc0247&logNo=80188225173&navType=by

SDL_RenderPresent

function

void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer);
C
복사

parameters

renderer : 렌더링할 렌더러

example

SDL_RenderPresent(renderer);
C
복사

메모리 해제

생성한 Texture 에 대해서 메모리를 해제해줍니다.
SDL_DestroyTexture(texture);
C
복사

최종 코드

최종적으로 아래의 코드를 돌리면 이미지가 뜹니다!
#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <stdio.h> #include <stdbool.h> SDL_Window *window; SDL_Renderer *renderer; // Window dimensions static const int width = 800; static const int height = 600; static int initAll() { if (SDL_Init(SDL_INIT_EVENTS) != 0) { fprintf(stderr, "%s\n", (SDL_GetError())); return (0); } // Create an SDL window window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL); if (window == 0) { fprintf(stderr, "%s\n", (SDL_GetError())); return (0); } // Create a renderer (accelerated and in sync with the display refresh rate) renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (renderer == 0) { fprintf(stderr, "%s\n", (SDL_GetError())); return (0); } int imgFlags = IMG_INIT_PNG; if( !( IMG_Init( imgFlags ) & imgFlags ) ) { printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() ); return (0); } return (1); } static void closeAll() { SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); IMG_Quit(); SDL_Quit(); } SDL_Texture *loadTexture(const char *file){ SDL_Surface *surface; SDL_Texture *texture; surface = IMG_Load(file); if (surface == NULL){ printf("fail to read %s\n", file); return NULL; } texture = SDL_CreateTextureFromSurface(renderer, surface); if (texture == NULL){ printf("unable to create texture.\n"); } SDL_FreeSurface(surface); return texture; } void drawTexture(SDL_Renderer *renderer,int x,int y,SDL_Texture *texture){ SDL_Rect src; SDL_Rect dst; src.x = 0; src.y = 0; SDL_QueryTexture(texture, NULL, NULL, &src.w, &src.h); dst.x = x; dst.y = y; dst.w = src.w; dst.h = src.h; SDL_RenderCopy(renderer, texture, &src, &dst); } int main(int argc,char **argv){ initAll(); SDL_Texture *texture; texture = loadTexture("image.png"); bool quit = false; SDL_Event event; while(!quit){ while(SDL_PollEvent(&event)){ switch(event.type){ case SDL_QUIT: quit = true; break; } } SDL_RenderClear(renderer); drawTexture(renderer, width / 2, height / 2, texture); SDL_RenderPresent(renderer); } SDL_DestroyTexture(texture); closeAll(); return 0; }
C
복사

Reference