Textures
객체에 디테일을 더하기 위한 2D 이미지
- 텍스쳐를 도형에 매핑하려면 도형의 vertex가 texture의 어느 위치에 해당하는지 지정해야됨
- 텍스쳐 좌표계 : 왼쪽 아래 원점(0,0)을 기준으로 x,y축에서 0~1사이의 값
- 텍스쳐 좌표계를 통해 가져온 텍스쳐의 색상 : sampling
Texture Wrapping
텍스쳐의 좌표 범위는 (0,0)에서 (1,1). 이 범위 밖의 좌표 → 기본적으로 텍스쳐 반복함
- GL_REPEAT: 기본 반복
- GL_MIRRORED_REPEAT: 대칭 반복
- GL_CLAMP_TO_EDGE: 0과 1 사이의 좌표를 clamping
- GL_CLAMP_TO_BORDER: 지정한 색으로 채움
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // x축
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // y축
(텍스쳐가 2D, x축(_S) /y축(_T)의 옵션 설정, texture wrapping 모드)
float borderColor[] = { 1.0, 1.0, 0.0, 1.0f };
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); //x축
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); //y축
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
GL_CLAMP_TO_BORDER의 경우 glTexParameterfv 함수 사용해 border 색상 설정
Texture Filtering
텍스쳐 좌표는 어떤 실수값도 될 수 있다. 어떤 텍스쳐 이미지의 픽셀(=텍셀 texel)에 텍스쳐 좌표를 매핑할지 결정하는 옵션 : texture filtering
큰 객체에 저해상도의 텍스쳐를 매핑할때 중요한 이슈 (이미지 확대 생각하기)
- Nearest Neighbor, Point Filtering
가장 가까운 픽셀의 색상 사용 ⇒ GL_NEAREST
- Linear Filtering or Bilinear Filtering
텍스쳐 좌표 주위의 텍셀 색상들을 interpolation. 텍스쳐 좌표와 가까운 텍셀일수록 해당 색상의 weight 커짐
MipMaps
- 멀리 떨어져 있는 객체가 가까이 있는 객체와 해상도가 같은 경우, 멀리 떨어진 객체는 적은 수의 fragment로 표현 ⇒ artifact 발생가능. 고화질의 텍스쳐 정보 지니면 메모리 낭비
- MipMap : 텍스쳐 이미지들의 크기 별 집합
- 거리가 멀어지면 저화질의 텍스쳐 매핑해 메모리 낭비를 줄일 수 있다.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); //축소
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //확대
- 2번째 파라미터 : 객체를 확대하거나 축소할때 어떤 texture filtering을 사용할지
- 3번째 파라미터 : 확대나 축소시 mipmap들을 어떻게 사용할지
- GL_NEAREST_MIPMAP_NEAREST : 가장 가까운 mipmap 선택 → nearest 샘플링
- GL_LINEAR_MIPMAP_NEAREST : 가장 가까운 1개 선택 → linear 샘플링
- GL_NEAREST_MIPMAP_LINEAR : 가장 가까운 2개 interpolation → nearest 샘플링
- GL_LINEAR_MIPMAP_LINEAR : 가장 가까운 2개 interpolation → linear 샘플링
Loading a Texture
- stb_image.h
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
- 텍스쳐 파일 로딩
int width, height, nrChannels;
unsigned char *data = stbi_load(“container.jpg", &width, &height, &nrChannels, 0);
Generating a Texture
- Texture 생성
unsigned int texture;
glGenTextures(1, &texture1);
//(생성할 텍스쳐 수, 리턴받을 texture array)
- Texture 객체 바인드
glBindTexture(GL_TEXTURE_2D, texture1);
- glTextImage2D
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
// (텍스쳐 타겟, mipmap 레벨(기본 0), 텍스쳐를 저장하고자 하는 포맷 지정
// 텍스쳐의 넓이, 높이, border, 소스 이미지의 포맷, 데이터타입, 텍스쳐 데이터 포인터)
Applying Textures
'강의 > HCI' 카테고리의 다른 글
[HCI] Graphics & OpenGL 3 (0) | 2025.04.03 |
---|---|
[HCI] Graphics & OpenGL 2 (0) | 2025.04.02 |
[HCI] Graphics & OpenGL 1 (1) | 2025.03.26 |