[c++] OpenGL에서의 텍스처 매핑

OpenGL은 그래픽 애플리케이션을 개발할 때 매우 강력한 도구입니다. 이를 사용하여 3D 모델에 텍스처를 매핑하여 더 생생한 그래픽 효과를 만들 수 있습니다. 이 글에서는 OpenGL에서 텍스처 매핑을 하는 방법에 대해 알아보겠습니다.

텍스처 좌표 생성

먼저, 3D 모델의 각 정점에 대한 텍스처 좌표를 생성해야 합니다. 텍스처 좌표는 2D 이미지를 3D 모델에 투영시키는 데 사용됩니다. 보통 3D 모델링 소프트웨어에서 텍스처 좌표를 지정하거나, 프로그램에서 자동으로 생성할 수 있습니다.

// 텍스처 좌표 생성 예시
GLfloat texCoords[] = {
    0.0f, 0.0f,  // 정점 1의 텍스처 좌표
    1.0f, 0.0f,  // 정점 2의 텍스처 좌표
    1.0f, 1.0f,  // 정점 3의 텍스처 좌표
    0.0f, 1.0f   // 정점 4의 텍스처 좌표
};

텍스처 로딩

OpenGL에서 텍스처를 사용하려면 먼저 이미지 파일을 로딩하여 텍스처로 변환해야 합니다. 이때 이미지 로딩 라이브러리를 사용하거나 직접 파일에서 데이터를 읽어와야 합니다.

// 텍스처 로딩 예시
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

// 이미지 파일 로딩 및 텍스처로 변환
int width, height, nrChannels;
unsigned char *data = stbi_load("texture.jpg", &width, &height, &nrChannels, 0);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
    // 이미지 로딩 실패 처리
}
stbi_image_free(data);

텍스처 매핑

텍스처를 생성하고 나면, 각 정점의 텍스처 좌표를 사용하여 3D 모델에 텍스처를 매핑할 수 있습니다. 이는 정점 셰이더와 프래그먼트 셰이더에서 수행됩니다.

정점 셰이더:

#version 330 core
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;

out vec2 TexCoord;

void main()
{
    // 변환 행렬을 적용한 정점 위치 계산

    TexCoord = texCoord;
}

프래그먼트 셰이더:

#version 330 core
in vec2 TexCoord;

out vec4 color;

uniform sampler2D texture1;

void main()
{
    color = texture(texture1, TexCoord);
}

결론

이제 OpenGL에서 텍스처 매핑을 구현하는 방법을 알아보았습니다. 텍스처를 좌표로 매핑하고, 셰이더를 사용하여 텍스처를 렌더링하는 등의 작업을 통해 더 생생한 그래픽 효과를 구현할 수 있습니다. OpenGL을 사용하여 그래픽 애플리케이션을 개발하는 경우, 텍스처 매핑 기술을 꼭 활용해보시기를 권장합니다.

참고 자료: