โ Texture
ํ
์ค์ฒ๋ ์ค๋ธ์ ํธ์ ๋ํ
์ผ์ ์ถ๊ฐํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ด๋ฏธ์ง์ด๋ค.
์ค๋ธ์ ํธ์ ํ
์ค์ฒ๋ฅผ ๋งคํํ์ฌ ๋ ์ฌ์ค์ ์ด๊ณ ์ธ๋ฐํ ์ธ๊ด์ ๊ฐ์ง ์ ์๋ค.
โ Mapping
ํ
์ค์ฒ ๋งคํ์ด๋ 2D ์ด๋ฏธ์ง(ํ
์ค์ฒ)๋ฅผ ์ค๋ธ์ ํธ์ ํ๋ฉด์ ์ ์ฉํ๋ ๊ธฐ์ ์ด๋ค.
ํ
์ค์ฒ๋ฅผ ์ผ๊ฐํ์ ๋งคํํ๊ธฐ ์ํด ์ผ๊ฐํ์ ๊ฐ Vertex์ ํ
์ค์ฒ์ ์ด๋ ๋ถ๋ถ์ด ํด๋นํ๋์ง๋ฅผ ์๋ ค์ฃผ์ด์ผ ํ๋ค.
๋ฐ๋ผ์ ๊ฐ ์ ์ ์๋ ํ
์ค์ฒ ์ด๋ฏธ์ง์ ์ด๋ ๋ถ๋ถ์ ์ํ๋งํ ์ง๋ฅผ ์ง์ ํ๋ ํ
์ค์ฒ ์ขํ๊ฐ ์์ด์ผ ํ๋ค.
์ดํ ํ๋๊ทธ๋จผํธ ๋ณด๊ฐ(Fragment Interpolation)์ด ๋๋จธ์ง ํ๋๊ทธ๋จผํธ์ ๋ํด ์์
์ ์ํํ๋ค.
- ํ
์ค์ฒ ์ขํ
2D ํ
์ค์ฒ ์ขํ๋ x, y์ถ ์์์ 0๋ถํฐ 1๊น์ง์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค.
ํ
์ค์ฒ๋ฅผ ์ผ๊ฐํ์ ๋งคํํ๊ธฐ ์ํด Vertex Shader์ 3๊ฐ์ ํ
์ค์ฒ ์ขํ๋ฅผ ์ ๋ฌํ๋ฉด Vertex Shader๋ ๊ทธ๊ฒ๋ค์ Fragment Shader์ ์ ๋ฌํ๊ณ Fragment Shader๋ ๊ฐ Fragment์ ๋ํด ํ
์ค์ฒ ์ขํ๋ฅผ ๊น๋ํ๊ฒ ๋ณด๊ฐํ๋ค.
float texCoords[] = {
0.0f, 0.0f, // bottom left
1.0f, 0.0f, // bottom right
0.5f, 1.0f // top
};
* ์ข์ธก ํ๋จ์ด (0, 0), ์ฐ์ธก ์๋จ์ด (1, 1)
- ์ํ๋ง
ํ
์ค์ฒ ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ ํ
์ค์ฒ ์ด๋ฏธ์ง์์ ์์์ ์ถ์ถํ๋ ๊ฒ์ 'Sampling'์ด๋ผ๊ณ ํ๋ค.
ํ
์ค์ฒ ์ํ๋ง์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ OpenGL์ด ํ
์ค์ฒ๋ฅผ ์ด๋ป๊ฒ ์ํ๋งํด์ผ ํ ์ง๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
โ Wrapping
ํ
์ค์ฒ ์ขํ๋ ์ผ๋ฐ์ ์ผ๋ก (0, 0) ~ (1, 1)์ ๋ฒ์๋ฅผ ๊ฐ์ง์ง๋ง, ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ขํ๋ฅผ ์ง์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ์ง ์ต์
์ ์ ๊ณตํ๋ค.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
โ ๋งค๊ฐ๋ณ์
1. ํ
์ค์ฒ ํ๊ฒ์ ์ง์
2. ์ต์
๊ณผ ์ด๋ค ์ถ์ ์ ์ฉํ ๊ฒ์ธ์ง ์ง์ (S, T, R ์ถ์ ๊ฐ๊ฐ x, y, z์ ๋์ผ)
3. Wrapping ์ต์
์ง์
โ Wrapping ์ต์
- GL_REPEAT : ํ
์ค์ฒ ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ณตํ๋ค (๊ธฐ๋ณธ ๋์)
- GL_MIRRORED_REPEAT : ์ข์ฐ ๋ฐ์ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ณตํ๋ค
- GL_CLAMP_TO_EDGE : ์ขํ๋ฅผ 0๊ณผ 1์ฌ์ด๋ก ๊ณ ์ ํด ๊ฐ์ฅ์๋ฆฌ๊ฐ ๋์ด๋ ํจํด์ ๋ง๋ ๋ค.
- GL_CLAMP_TO_BORDER : ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ขํ๋ ์ฌ์ฉ์๊ฐ ์ง์ ํ ํ
๋๋ฆฌ ์์์ ๊ฐ๋๋ค. (glTexParameterfv ํจ์๋ฅผ ์ด์ฉํ์ฌ ํ
๋๋ฆฌ ์๋ ์ถ๊ฐ๋ก ์ค์ ํ์)
โ Filtering
ํ
์ค์ฒ ์ขํ๋ ํด์๋์ ์์กดํ์ง ์์ง๋ง, ๋ถ๋ ์์์ ๊ฐ์ผ ์ ์๋ค. ๋ฐ๋ผ์ OpenGL์ ํ
์ค์ฒ ์ขํ๋ฅผ ์ด๋ค ํ
์ค์ฒ ํฝ์
(Texel)๊ณผ ๋งคํํ ์ง ๊ฒฐ์ ํด์ผ ํ๋ค. ์ด๊ฒ์ ํนํ ํฐ ๊ฐ์ฒด์ ์ ํด์๋ ํ
์ค์ฒ๋ฅผ ์ฌ์ฉํ ๋ ์ค์ํ๋ค.
โ Filtering ์ต์
- GL_NEAREST : OpenGL์ ๊ธฐ๋ณธ ํ
์ค์ฒ ํํฐ๋ง ๋ฐฉ๋ฒ์ด๋ค. GL_NEAREST๋ก ์ค์ ๋๋ฉด, OpenGL์ ํ
์ค์ฒ ์ขํ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ค์ฌ์ ๊ฐ์ง ํ
์
์ ์ํ๋ง๋ ์์์ผ๋ก ์ ํํ๋ค. (nearest neighbor ๋๋ point filtering์ผ๋ก๋ ์๋ ค์ ธ ์์)
- GL_LINEAR : ํ
์ค์ฒ ์ขํ์ ์ธ์ ํ ํ
์
๋ค๋ก๋ถํฐ ๋ณด๊ฐ๋ ๊ฐ์ ์ทจํ์ฌ, ํ
์
๋ค ์ฌ์ด์ ์์์ ๊ทผ์ฌํ๋ค. ํ
์ค์ฒ ์ขํ์์ ํ
์
์ ์ค์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ์ด์ํ ํฝ์
๋ค์ ํผํฉ๋ ์์์ด ๋ฐํ๋๋ค. ((bi)linear filtering์ผ๋ก๋ ์๋ ค์ ธ ์์)
→ GL_NEAREST ์ต์
์ ํฝ์
๋ค์ด ๋ช
ํํ ๋ณด์ด๊ณ GL_LINEAR ์ต์
์ ๋งค๋๋ฌ์ด ํจํด์ ์์ฑํ๋ค.
ํ
์ค์ฒ ํํฐ๋ง์ ํ๋ ๋ฐ ์ถ์ ์์
(ํฌ๊ธฐ๋ฅผ ํค์ฐ๊ฑฐ๋ ์ค์ผ ๋) ๋ชจ๋์ ๋ํด ์ค์ ํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ ๊ฐ์ง ์ต์
์ ๋ํ ํํฐ๋ง ๋ฐฉ๋ฒ์ glTexParameter ํจ์๋ฅผ ํตํด ์ง์ ํด์ผ ํ๋ค.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
โ Mipmaps
๋ ๋๋ง ์ ๋ฉ๋ฆฌ ๋จ์ด์ง ์ค๋ธ์ ํธ์ ํ
์ค์ฒ๋ก ์์ ํฌ๊ธฐ์ ํ
์ค์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์จ๋ฆฌ์ด์ฑ์ ๊ฐ์์ํค๋ ๊ธฐ๋ฒ์ด๋ค.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
glGenerateMipmap ํจ์๋ฅผ ํธ์ถํ์ฌ OpenGl์ด mipmap์ ์๋์ผ๋ก ์์ฑํ๋ค.
์ถ์ ํํฐ๋ง ์ต์
์ _MIPMAP_ ์ต์
์ผ๋ก ๋์ฒดํ๋ค.
* ํ
์ค์ฒ ํ๋ ์์
์(ํํฐ๋ง ์ต์
์ค ํ๋(MAG) ํํฐ๋ก ์ค์ ํ ๊ฒฝ์ฐ)์๋ mipmap ํจ๊ณผ๊ฐ ์๋ค (mipmap์ ํ
์ค์ฒ๊ฐ ์ถ์๋ ๋ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ)
โ Texture ๋ก๋ ๋ฐ ์์ฑ
ํ
์ค์ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์ฉ ํ๋ก๊ทธ๋จ์ ํ
์ค์ฒ๋ฅผ ๋ก๋ํด์ผ ํ๋ค.
โ ํ ์ค์ฒ ๋ก๋
- stb_image.h
stb_image.h๋ ํ์ผ ํ์์ ๋ก๋ํ ์ ์๊ณ ํ๋ก์ ํธ์ ํตํฉํ ์ ์๋ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ '์ฑ๊ธ ํค๋ ์ด๋ฏธ์ง ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ'์ด๋ค.
๋ค์ด๋ก๋ : https://github.com/nothings/stb/blob/master/stb_image.h
ํค๋ํ์ผ์ ๋ค์ด๋ก๋ํ์ฌ ํ๋ก์ ํธ์ ์ถ๊ฐํ ํ C++ ํ์ผ์ ์ถ๊ฐํ๋ค
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
STB_IMAGE_IMPLEMENTATION์ ์ ์ํจ์ผ๋ก์จ ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํค๋ ํ์ผ์ ์์ ํ์ฌ ๊ด๋ จ๋ ์ ์ ์์ค ์ฝ๋๋ง ํฌํจํ๋๋ก ํ์ฌ ํค๋ ํ์ผ์ .cpp ํ์ผ๋ก ๋ณํํ๋ค.
int width, height, nrChannels;
unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);
stbi_load ํจ์๋ฅผ ํธ์ถํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ค.
* ๋งค๊ฐ๋ณ์ : ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก, ๋๋น, ๋์ด, ์ปฌ๋ฌ ์ฑ๋์ ์
โ ํ ์ค์ฒ ์์ฑ
์ด์ ์ OpenGL ๊ฐ์ฒด๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ
์ค์ฒ๋ ID๋ก ์ฐธ์กฐ๋๋ค.
๊ฐ์ฒด ์์ฑ ๋ฐ ๋ฐ์ธ๋ฉ ์ดํ glTexImage2D ํจ์๋ฅผ ํธ์ถํ์ฌ ํ
์ค์ฒ๋ฅผ ์์ฑํ๋ค.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
- glTexImage2D ๋งค๊ฐ๋ณ์
1. ํ
์ค์ฒ ํ๊ฒ
2. mipmap ๋ ๋ฒจ ์๋ ์ง์ (๊ธฐ๋ณธ = 0)
3. ํ
์ค์ฒ ํฌ๋งท
4. ํ
์ค์ฒ ๋๋น
5. ํ
์ค์ฒ ๋์ด
6. ํญ์ 0
7. ์๋ณธ ์ด๋ฏธ์ง์ ํฌ๋งท
8. ์๋ณธ ์ด๋ฏธ์ง์ ๋ฐ์ดํฐ ํ์
9. ์ค์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ
โ ์ ์ฒด ๊ณผ์
// ๊ฐ์ฒด ์์ฑ
unsigned int texture;
glGenTextures(1, &texture);
// ๋ฐ์ธ๋ฉ
glBindTexture(GL_TEXTURE_2D, texture);
// ํ
์ค์ฒ Wrapping / Filtering ์ต์
์ค์
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// ํ
์ค์ฒ ๋ก๋
int width, height, nrChannels;
unsigned char *data = stbi_load("์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก", &width, &height, &nrChannels, 0);
// ํ
์ค์ฒ ์์ฑ
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
// ๋ฉ๋ชจ๋ฆฌ ๋ฐํ
stbi_image_free(data);'๐จ Graphics > ๐ต OpenGL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [OpenGL] Texture ์ ๋ (0) | 2024.07.28 |
|---|---|
| [OpenGL] Texture ์ ์ฉ (0) | 2024.07.28 |
| [OpenGL] Shader (2) | 2024.07.24 |
| [OpenGL] EBO (0) | 2024.07.18 |
| [OpenGL] ์ผ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ (0) | 2024.07.17 |