๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ˜ธ OpenGL

[Learn OpenGL] Textures - 1

by HOENDEV 2023. 11. 20.

๊ฐ์ฒด์— ๋” ๋งŽ์€ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ ์ •์ ์— ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํฅ๋ฏธ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์‹ค๊ฐ์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งŽ์€ ์ˆ˜์˜ ์ •์ ์ด ํ•„์š”ํ•˜๊ณ , ๊ฐ ์ •์ ๋งˆ๋‹ค ์ƒ‰์ƒ ์†์„ฑ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํ•œ ์ถ”๊ฐ€ ๋ถ€๋‹ด์ด ์ƒ๊น๋‹ˆ๋‹ค.

 

๋Œ€๋ถ€๋ถ„์˜ ์˜ˆ์ˆ ๊ฐ€์™€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

 

ํ…์Šค์ฒ˜๋Š” ๊ฐ์ฒด์— ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” 2D ์ด๋ฏธ์ง€ ์ž…๋‹ˆ๋‹ค.

 

ํ…์Šค์ฒ˜๋ฅผ ์ข…์ด ํ•œ ์žฅ์— ๋ฒฝ๋Œ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

 

์ด ์ข…์ด๋ฅผ 3D ์ง‘ ์œ„์— ๊น”๋”ํ•˜๊ฒŒ ์ ์–ด์„œ ์ง‘์ด ๋Œ๋กœ ๋œ ์™ธ๊ด€์„ ๊ฐ€์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€์— ๋งŽ์€ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ถ”๊ฐ€์ ์ธ ์ •์ ์„ ์ง€์ •ํ•  ํ•„์š” ์—†์ด ๊ฐ์ฒด๊ฐ€ ๋งค์šฐ ์„ธ๋ถ€์ ์œผ๋กœ ๋ณด์ด๋Š” ์ฐฉ๊ฐ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ด๋ฏธ์ง€ ์™ธ์—๋„ ํ…์Šค์ฒ˜๋Š” ์›จ์ด๋”์— ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅธ ๋‹ค๋ฅธ ์ฃผ์ œ์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

์‚ผ๊ฐํ˜•์— ํ…์Šค์ฒ˜๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ผ๊ฐํ˜•์˜ ๊ฐ ์ •์ ์ด ํ…์Šค์ฒ˜์˜ ์–ด๋А ๋ถ€๋ถ„์— ํ•ด๋‹นํ•˜๋Š”์ง€ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๊ฐ ์ •์ ์—๋Š” ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€์—์„œ ์ƒ˜ํ”Œ๋งํ•  ๋ถ€๋ถ„์„ ์ง€์ •ํ•˜๋Š” ํ…์Šค์ฒ˜ ์ขŒํ‘œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ ํ›„ ํ”„๋ž˜๊ทธ๋จผํŠธ ๋ณด๊ฐ„์ด ๋‹ค๋ฅธ ํ”„๋ž˜๊ทธ๋จผํŠธ์— ๋Œ€ํ•œ ๋‚˜๋จธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

 

ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋Š” x์ถ•๊ณผ y์ถ•์—์„œ 0๋ถ€ํ„ฐ 1๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค(2D ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”).

 

ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์Šค์ฒ˜ ์ƒ‰์ƒ์„ ์–ป๋Š” ๊ฒƒ์„ ์ƒ˜ํ”Œ๋ง์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋Š” ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€์˜ ์™ผ์ชฝ ํ•˜๋‹จ ๋ชจ์„œ๋ฆฌ์— ๋Œ€ํ•ด (0,0)์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ์— ๋Œ€ํ•ด (1,1)๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ด๋ฏธ์ง€๋Š” ์‚ผ๊ฐํ˜•์— ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค

 

 

์‚ผ๊ฐํ˜•์— ๋Œ€ํ•ด 3๊ฐœ์˜ ํ…์Šค์ฒ˜ ์ขŒํ‘œ ์ ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ผ๊ฐํ˜•์˜ ์™ผ์ชฝ ํ•˜๋‹จ์ด ํ…์Šค์ฒ˜์˜ ์™ผ์ชฝ ํ•˜๋‹จ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์‚ผ๊ฐํ˜•์˜ ์™ผ์ชฝ ํ•˜๋‹จ ์ •์ ์— (0,0) ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ (1,0) ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ผ๊ฐํ˜•์˜ ์ƒ๋‹จ์€ ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€์˜ ์ƒ๋‹จ ์ค‘์•™์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ (0.5,1.0)์„ ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์ •์  ์…ฐ์ด๋”์—๋Š” 3๊ฐœ์˜ ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋งŒ ์ „๋‹ฌํ•˜๋ฉด ๋˜๋ฉฐ, ์ด๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์— ์ „๋‹ฌ๋˜์–ด ๊ฐ ํ”„๋ž˜๊ทธ๋จผํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋ณด๊ฐ„ํ•ฉ๋‹ˆ๋‹ค.

 

float texCoords[] = {
    0.0f, 0.0f,  // lower-left corner  
    1.0f, 0.0f,  // lower-right corner
    0.5f, 1.0f   // top-center corner
};

 

ํ…์Šค์ฒ˜ ์ƒ˜ํ”Œ๋ง์€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” OpenGL์— ํ…์Šค์ฒ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ˜ํ”Œ๋งํ•ด์•ผ ํ•˜๋Š”์ง€ ์ง€์‹œํ•˜๋Š” ์šฐ๋ฆฌ์˜ ์—ญํ• ์ž…๋‹ˆ๋‹ค.

 

Texture Wrapping

ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋Š” ๋ณดํ†ต (0,0)์—์„œ (1,1) ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฒ”์œ„ ๋ฐ–์˜ ์ขŒํ‘œ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

 

OpenGL์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ถ€๋™ ์†Œ์ˆ˜์  ํ…์Šค์ฒ˜ ์ขŒํ‘œ์˜ ์ •์ˆ˜ ๋ถ€๋ถ„์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ OpenGL์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

 

GL_REPEAT: ํ…์Šค์ฒ˜์˜ ๊ธฐ๋ณธ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

 

GL_MIRRORED_REPEAT: GL_REPEAT๊ณผ ๋™์ผํ•˜์ง€๋งŒ ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค ์ด๋ฏธ์ง€๋ฅผ ๋ฏธ๋Ÿฌ๋งํ•ฉ๋‹ˆ๋‹ค.

 

GL_CLAMP_TO_EDGE: ์ขŒํ‘œ๋ฅผ 0๊ณผ 1 ์‚ฌ์ด๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋” ๋†’์€ ์ขŒํ‘œ๋Š” ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ๊ณ ์ •๋˜์–ด ๊ฐ€์žฅ์ž๋ฆฌ ํŒจํ„ด์ด ๋Š˜์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

GL_CLAMP_TO_BORDER: ๋ฒ”์œ„ ๋ฐ–์˜ ์ขŒํ‘œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

 

๊ฐ ์˜ต์…˜์€ ๊ธฐ๋ณธ ๋ฒ”์œ„ ๋ฐ–์˜ ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค๋ฅธ ์‹œ๊ฐ์  ์ถœ๋ ฅ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ƒ˜ํ”Œ ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€(Hólger Rezende)์—์„œ ์ด๋Ÿฌํ•œ ์˜ต์…˜์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

 

 

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๊ฐ ์˜ต์…˜์€ glTexParameter* ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ขŒํ‘œ ์ถ•(s, t (3D ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ r) x,y,z์— ํ•ด๋‹น)๋งˆ๋‹ค ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

 

์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ…์Šค์ฒ˜ ๋Œ€์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 2D ํ…์Šค์ฒ˜๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ…์Šค์ฒ˜ ๋Œ€์ƒ์€ GL_TEXTURE_2D์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•˜๋ ค๋Š” ์˜ต์…˜๊ณผ ํ…์Šค์ฒ˜ ์ถ•์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” S์™€ T ์ถ• ๋ชจ๋‘์— ๋Œ€ํ•ด ๊ตฌ์„ฑํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ธ์ž๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ…์Šค์ฒ˜ ๋ž˜ํ•‘ ๋ชจ๋“œ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ OpenGL์€ ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ ํ…์Šค์ฒ˜์— GL_MIRRORED_REPEAT์œผ๋กœ ํ…์Šค์ฒ˜ ๋ž˜ํ•‘ ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

GL_CLAMP_TO_BORDER ์˜ต์…˜์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ๋„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Š” GL_TEXTURE_BORDER_COLOR๋ฅผ ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” glTexParameter ํ•จ์ˆ˜์˜ fv ๋“ฑ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ ๊ฐ’์˜ ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);

 

Texture Filtering

ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋Š” ํ•ด์ƒ๋„์— ๋งž์ถฐ์ง€์ง€ ์•Š๊ณ  ์–ด๋–ค ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’๋„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— OpenGL์€ ํ…์Šค์ฒ˜ ์ขŒํ‘œ์— ๋งคํ•‘ํ•  ํ…์Šค์ฒ˜ ํ”ฝ์…€(ํ…์…€)์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Š” ํŠนํžˆ ํฐ ๊ฐ์ฒด์—์„œ ํ•ด์ƒ๋„๊ฐ€ ๋‚ฎ์€ ํ…์Šค์ฒ˜๋ฅผ ๊ฐ€์งˆ ๋•Œ ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค.

 

์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์˜ต์…˜์ธ GL_NEAREST์™€ GL_LINEAR์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

GL_NEAREST(๋˜ํ•œ ์ตœ๊ทผ์ ‘ ์ด์›ƒ ๋˜๋Š” ํฌ์ธํŠธ ํ•„ํ„ฐ๋ง์œผ๋กœ ์•Œ๋ ค์ง)์€ OpenGL์˜ ๊ธฐ๋ณธ ํ…์Šค์ฒ˜ ํ•„ํ„ฐ๋ง ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

GL_NEAREST๋กœ ์„ค์ •ํ•˜๋ฉด, OpenGL์€ ํ…์Šค์ฒ˜ ์ขŒํ‘œ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ค‘์‹ฌ์„ ๊ฐ€์ง„ ํ…์…€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜์—๋Š” ์‹ญ์ž๊ฐ€๊ฐ€ ์ •ํ™•ํ•œ ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 4๊ฐœ์˜ ํ”ฝ์…€์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์™ผ์ชฝ ์ƒ๋‹จ์˜ ํ…์…€์ด ํ…์Šค์ฒ˜ ์ขŒํ‘œ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ค‘์‹ฌ์„ ๊ฐ€์ง€๋ฏ€๋กœ ์ƒ˜ํ”Œ๋ง๋œ ์ƒ‰์ƒ์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค

 

 

 

GL_LINEAR(๋˜ํ•œ (์Œ)์„ ํ˜• ํ•„ํ„ฐ๋ง์œผ๋กœ ์•Œ๋ ค์ง)๋Š” ํ…์Šค์ฒ˜ ์ขŒํ‘œ ์ฃผ๋ณ€์˜ ํ…์…€์—์„œ ๋ณด๊ฐ„๋œ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ํ…์…€ ์‚ฌ์ด์˜ ์ƒ‰์ƒ์„ ๊ทผ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

ํ…์Šค์ฒ˜ ์ขŒํ‘œ์—์„œ ํ…์…€ ์ค‘์‹ฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ž‘์„์ˆ˜๋ก ํ•ด๋‹น ํ…์…€์˜ ์ƒ‰์ƒ์ด ์ƒ˜ํ”Œ๋ง๋œ ์ƒ‰์ƒ์— ๋” ๋งŽ์ด ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ์šฐ๋ฆฌ๋Š” ์ด์›ƒํ•˜๋Š” ํ”ฝ์…€๋“ค์˜ ํ˜ผํ•ฉ๋œ ์ƒ‰์ƒ์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ํ…์Šค์ฒ˜ ํ•„ํ„ฐ๋ง ๋ฐฉ๋ฒ•์˜ ์‹œ๊ฐ์  ํšจ๊ณผ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ์ €ํ•ด์ƒ๋„ ํ…์Šค์ฒ˜๋ฅผ ํฐ ๊ฐ์ฒด์— ์‚ฌ์šฉํ•  ๋•Œ(ํ…์Šค์ฒ˜๋Š” ๋”ฐ๋ผ์„œ ํ™•๋Œ€๋˜์–ด ๊ฐœ๋ณ„ ํ…์…€์ด ๋ˆˆ์— ๋„๊ฒŒ ๋จ) ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ด…์‹œ๋‹ค.

 

 

GL_NEAREST๋Š” ํ…์Šค์ฒ˜๋ฅผ ํ˜•์„ฑํ•˜๋Š” ํ”ฝ์…€์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ด๋Š” ์ฐจ๋‹จ๋œ ํŒจํ„ด์„ ๊ฒฐ๊ณผ๋กœ ํ•˜๋ฉฐ, GL_LINEAR๋Š” ๊ฐœ๋ณ„ ํ”ฝ์…€์ด ๋œ ๋ณด์ด๋Š” ๋” ๋ถ€๋“œ๋Ÿฌ์šด ํŒจํ„ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

GL_LINEAR๋Š” ๋” ํ˜„์‹ค์ ์ธ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋“ค์€ ๋” 8๋น„ํŠธ ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ GL_NEAREST ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

 

ํ…์Šค์ฒ˜ ํ•„ํ„ฐ๋ง์€ ํ™•๋Œ€ ๋ฐ ์ถ•์†Œ ์ž‘์—…(ํ™•๋Œ€ ๋˜๋Š” ์ถ•์†Œ ์‹œ)์— ๋Œ€ํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด ํ…์Šค์ฒ˜๊ฐ€ ์ถ•์†Œ๋  ๋•Œ ์ตœ๊ทผ์ ‘ ์ด์›ƒ ํ•„ํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๊ณ  ํ™•๋Œ€๋œ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ์„ ํ˜• ํ•„ํ„ฐ๋ง์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

 

Mipmaps

๋ฐฉ ์•ˆ์— ์ˆ˜์ฒœ๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ์žˆ๊ณ  ๊ฐ๊ฐ์—๋Š” ํ…์Šค์ฒ˜๊ฐ€ ๋ถ™์–ด ์žˆ๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์–ด๋–ค ๊ฐ์ฒด๋Š” ๋ฉ€๋ฆฌ ์žˆ์„ ๊ฒƒ์ด๊ณ  ์–ด๋–ค ๊ฐ์ฒด๋Š” ๊ฐ€๊นŒ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

์ด ๋‘˜์ด ๊ฐ™์€ ํ•ด์ƒ๋„์˜ ํ…์Šค์ฒ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด๋•Œ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๊ฐ์ฒด๋Š” fragment๋ฅผ ๊ฑฐ์˜ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋•Œ OpenGL์€ ์ •ํ™•ํ•œ ์ƒ‰์ƒ์„ ์–ป๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ์ง€๋Š”๋ฐ,

 

๋„“์€ ์˜์—ญ์˜ ํ…์Šค์ฒ˜๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

์ด๋Ÿฐ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด OpenGL์€ mipmaps๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ๊ฐ์˜ ํ…์Šค์ฒ˜๊ฐ€ ์ด์ „ ํ…์Šค์ฒ˜์˜ ์ ˆ๋ฐ˜์ธ ์ด๋ฏธ์ง€ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

 

๊ด€์ฐฐ์ž๋กœ๋ถ€ํ„ฐ ์ผ์ • ๊ฑฐ๋ฆฌ ํ•œ๊ณ„์  ์ดํ›„์— OpenGL์€ ๊ฐ์ฒด์™€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋‹ค๋ฅธ mimaps ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ฏธ๋งต ๋ ˆ๋ฒจ ๊ฐ„ ํ•„ํ„ฐ๋ง ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋ ค๋ฉด ์›๋ž˜ ํ•„ํ„ฐ๋ง ๋ฐฉ๋ฒ•์„ ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

GL_NEAREST_MIPMAP_NEAREST: ํ”ฝ์…€ ํฌ๊ธฐ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฏธ๋งต์„ ์„ ํƒํ•˜๊ณ  ํ…์Šค์ฒ˜ ์ƒ˜ํ”Œ๋ง์„ ์œ„ํ•ด ์ตœ๊ทผ์ ‘ ์ด์›ƒ ๋ณด๊ฐ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

GL_LINEAR_MIPMAP_NEAREST: ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฏธ๋งต ๋ ˆ๋ฒจ์„ ์„ ํƒํ•˜๊ณ  ๊ทธ ๋ ˆ๋ฒจ์„ ์„ ํ˜• ๋ณด๊ฐ„์œผ๋กœ ์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค.

 

GL_NEAREST_MIPMAP_LINEAR: ํ”ฝ์…€ ํฌ๊ธฐ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๋ฏธ๋งต ์‚ฌ์ด๋ฅผ ์„ ํ˜•์œผ๋กœ ๋ณด๊ฐ„ํ•˜๊ณ  ๋ณด๊ฐ„๋œ ๋ ˆ๋ฒจ์„ ์ตœ๊ทผ์ ‘ ์ด์›ƒ ๋ณด๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค.

 

GL_LINEAR_MIPMAP_LINEAR: ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๋ฏธ๋งต ์‚ฌ์ด๋ฅผ ์„ ํ˜•์œผ๋กœ ๋ณด๊ฐ„ํ•˜๊ณ  ๋ณด๊ฐ„๋œ ๋ ˆ๋ฒจ์„ ์„ ํ˜• ๋ณด๊ฐ„์œผ๋กœ ์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜ ํ•„ํ„ฐ๋ง๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ glTexParameteri๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋ง ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

 

์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜๋Š” ํ™•๋Œ€ ํ•„ํ„ฐ๋กœ ๋ฏธ๋งต ํ•„ํ„ฐ๋ง ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด๊ฒƒ์€ ๋ฏธ๋งต์ด ์ฃผ๋กœ ํ…์Šค์ฒ˜๊ฐ€ ์ถ•์†Œ๋  ๋•Œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋Ÿฐ ํšจ๊ณผ๊ฐ€ ์—†์œผ๋ฉฐ, ๋ฏธ๋งต ํ•„ํ„ฐ๋ง ์˜ต์…˜์„ ์ฃผ๋ฉด OpenGL GL_INVALID_ENUM ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

'๐Ÿ˜ธ OpenGL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

OpenGL ์šฉ์–ด ์ •๋ฆฌ  (0) 2023.11.19
[Learn OpenGL] Shaders - 3  (0) 2023.11.18
[Learn OpenGL] Shaders - 2  (0) 2023.11.18
[Learn OpenGL] Shaders - 1  (1) 2023.11.18
[Learn OpenGL] Hello Triangle - 4  (0) 2023.11.18