본문 바로가기
컴퓨터 그래픽스/Ray Tracing

Ray Tracing(8) - 텍스처링(1)

by SL123 2024. 7. 8.

 

이번 포스팅에서는 컴퓨터 그래픽스에서 빼놓을 수 없는 텍스처링에

대해서 알아보겠습니다.

이미지 출저는 미드저니입니다.

 

아무것도 없는 사진을 올려보도록 하겠습니다.

컴퓨터 그래픽스에서는 이 사각형은 색깔이 회색인 삼각형 2개에 불과합니다.

 

 

하지만 2D Image를 입혀주면 아주 자세하게 그림을 그려줍니다.

 

렌더링 부분에서도 모델러가 자세하게 폴리곤 10만개 그려서 자세하게

만드는 것보다 단순한 삼각형 2개에 사진을 덧붙이며 만드는 것이 더 빠릅니다.

(디자이너, 개발자 모두 좋아함)

 

 

렌더링 하는 평면 사각형은 아주 간단한 구조를 이루고 있습니다.

이 사각형을 정의할 때 Vertex를 4개 사용합니다. 

 

텍스처의 뜻은 질감을 의미합니다.

3차원 물체의 표면에 2차원 이미지를 입혀서 적은 삼각형으로도 높은

디테일을 표현할 수 있게 해주는 렌더링 관련 요소이며,

3D Model의 이미지가 어떻게 덧씌워 줄 지(질감을 어떻게 정해줄 지)

결정해야합니다.

 

그래픽스에서 텍스처 이미지를 어느 위치에서 색깔값을 가져올 지 정해주게 됩니다.

이 때 사용하는 좌표는 텍스처 좌표(Texture Coordinate) 입니다.

 

(DirectX 기준)

텍스처 좌표를 일반적으로 u와 v로 정의하고, 왼쪽 상단을 기준으로 합니다.

오른쪽 방향으로 진행하면 u의 좌표가 증가하고 밑 방향으로 진행하면 v가 증가합니다.

 

이렇게 uv좌표를 이용해 텍스처를 사용하려고 하는 데, 만약 이미지가 바뀔 때 마다

해상도의 좌표가 매번 바뀌면 아주 불편할 것입니다.

 

그래서 이미지를 u =1, v = 1를 기준으로 합니다.

하지만 이 또한  종횡비(aspect ratio) 가 1이 아닌 이미지, 즉 가로나 세로가

다른 이미지로 텍스처를 만들면 종횡비가 유지되지 않는 문제가 발생하게 됩니다.

이 때 UV매핑을 통해 종횡비를 맞춰 보겠습니다.

 

그러면 텍스처 좌표로부터 이미지 픽셀값을 가져오는 방법의 원리를 알아보겠습니다.

텍스처링을 할 때는 각각의 Vertex에 텍스처 좌표를 지정해줍니다.

 

텍스처 이미지는 uv좌표로 이루어져 있기 때문에 2차원입니다.

그렇기 때문에 텍스처 좌표들도 2차원으로 정의가 됩니다.

 

만약 V1의 색을 결정한다고 하면 텍스처 좌표계의 (1,0) 에서

색깔값을 가져오게 됩니다.

 

V0, V2, V3도 마찬가지로 정해둔 좌표를 가져올 수 있습니다.

 

이렇게 구한 값을 무게 중심 좌표계를 이용한다면 어떤 픽셀이든 평균을 구해 좌표를

알아낼 수 있습니다. 그것을 이용해 텍스처의 색깔을 모두 전해받을 수 있습니다.

 

예를 들어 임의의 점 p의 색깔값을 텍스처링으로 구하고 싶다고 가정해봅시다.

일단 p의 텍스처 좌표를 구해야합니다. 이 때 텍스처 좌표 uv(P) 라고

가정한다면 uv(P)를 무게 중심 좌표계로 구할 수 있습니다.

구한 텍스처 좌표를 이용해 텍스처의 색깔값을 받아와 사용할 수 있게 됩니다.

이러한 색깔값을 가져오는 기법을 Sampling(샘플링) 이라고 합니다.

 

그럼 이제 무게 중심 좌표계로 uv 좌표를 알아보죠.

uv(P) = uv0 * w0 + uv1 *w1 + uv2 * (1.0f - w0 - w1);

 

1.0f - w0 - w1 는 w0 + w1 + w2 = 1 이라는 공식 기반으로 나왔습니다.

 

w는 삼각형의 넓이를 이용해 구할 수 있고

삼각형의 넓이는 외적으로 구할 수 있습니다.

 

이제 uv 좌표의 픽셀의 색깔을 넣어볼건데 uv 매핑인 Wrap과 Clamp를 

사용할 것입니다. Wrap과 Clamp는 텍스처 매핑에서 UV 좌표가

텍스처의 경계를 넘어갈 때의 처리 방식을 나타내는 두 가지 옵션입니다.

 

Wrap (감싸기):

 

    UV 좌표가 0에서 1 사이를 벗어날 경우, Wrap 옵션은 UV 좌표를

    반복적으로 텍스처에 매핑합니다.

 

    예를 들어, UV 좌표가 1.2라면 Wrap 모드에서는 이를 0.2로 처리하여

    텍스처를 반복해서 사용합니다.

 

    Wrap 모드는 텍스처가 여러 번 반복되는 효과를 줄 때 유용합니다.

 

Clamp (잠그기):

 

    UV 좌표가 0에서 1 사이를 벗어날 경우, Clamp 옵션은 UV 좌표를

    가장자리 값(0 또는 1)에 맞추어 텍스처를 매핑합니다.

 

    예를 들어, UV 좌표가 1.2라면 Clamp 모드에서는 이를 1로 처리하여

    텍스처의 가장자리 값을 사용합니다.

 

    Clamp 모드는 특정 영역에 텍스처를 고정시킬 때 유용합니다.

 

차이점 요약:

 

    Wrap: UV 좌표가 텍스처의 경계를 넘어가면 반복적으로 매핑합니다.

               주기적인 반복 효과를 생성할 수 있습니다.

     

    Clamp: UV 좌표가 텍스처의 경계를 넘어가면 가장자리 값에 맞추어

                  매핑합니다. 텍스처를 고정된 영역에 맞추는 데 사용됩니다.

 

Wrap

https://learn.microsoft.com/en-us/windows/win32/direct3d9/wrap-texture-address-mode

 

Wrap Texture Address Mode (Direct3D 9) - Win32 apps

The wrap texture address mode, identified by the D3DTADDRESS\_WRAP member of the D3DTEXTUREADDRESS enumerated type, makes Direct3D repeat the texture on every integer junction.

learn.microsoft.com

 

Clamp

https://learn.microsoft.com/en-us/windows/win32/direct3d9/clamp-texture-address-mode

 

Clamp Texture Address Mode (Direct3D 9) - Win32 apps

The clamp texture address mode, identified by the D3DTADDRESS\_CLAMP member of the D3DTEXTUREADDRESS enumerated type, causes Direct3D to clamp your texture coordinates to the \[0.0, 1.0\] range.

learn.microsoft.com

 

이어서 텍스처링(2) 로 돌아오겠습니다.

감사합니다.