이전시간에 Surface 를 이용하여 이미지를 출력하는 방법을 알아봤다.
이번에는 Texture 를 이용하여 이미지를 출력하는 방법을 알아보자
이미지를 바로 Texture 로 불러오지는 못하고, Surface 로 이미지를 불러오고,
Surface 를 Texture 로 변경하여 쓴다
함수를 하나씩 알아보면서 확인해보자.
사전 준비
Texture 는 렌더러가 렌더링하기 때문에, 이번에는 다시 렌더러가 필요합니다.
따라서 SDL_CreateRenderer 와 IMG_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
복사