Graphics/DirectX

Direct 3D - 텍스쳐

MOLOKINI 2014. 7. 21. 10:32



이번에는,, 텍스쳐를 사용하는데 있어서 필요한 전반적인 지식을 알려드릴겁니다.
텍스쳐를 잘 활용하는 능력은 화려한 3D 그래픽을 표현하는데 있어 가장 중요합니다.
최근에는 절차적 텍스쳐(procedural texture)를 사용하는 새로운 추세가 생겼습니다..





텍스쳐 좌표계
텍스쳐는 1, 2, 3, 4차원 좌표계를 가질 수 있는데,
일반적으로는 2차원 텍스쳐를 사용하게 된다.
3차원 환경 맵핑도 사실은 3차원 좌표계가 아니라 2차원 좌표계를 사용한다.

Direct 3D의 텍스쳐 좌표계

2차원 텍스쳐 이미지를 3차원 공간의 폴리곤에 입히기 위해 변환하는데 기준이 되는 좌표계, 그냥 uv좌표라고 불리운다. 



uv좌표계가 0.0부터 1.0사이의 값을 갖는 텍스쳐 좌표계라면 실제로 이미지의 크기에 따른 좌표계는 텍셀(texel = texture + pixel)좌표계라 한다.

텍셀이란 uv 좌표값에 의해서 실제로 결정되는 텍스쳐 이미지의 픽셀값을 말한다.

텍셀 좌표게를 나타내기위해서 st를 사용한다.

 텍셀 좌표계

같은 uv좌표값이라도 어떤 크기의 텍스쳐를 사용하느냐에따라서 다른 텍셀값을 가질 수 있다.

 텍셀값의 변화


이렇게 만들어진 텍스쳐 좌표가 최종 폴리곤에 적용되는 과정은 아래와 같다

 

그러면 저기 저기저기 삼각형 안에 있는 텍스쳐가 최종적으로 적용되는 것!


볼륨텍스쳐라는 3차원 텍스쳐가 있는데.

그건 u, v, w 좌표계로 w라는 x, y, z 좌표로 따지자면 z축에 해당하는 좌표축이 하나 추가되는 것이다



텍스쳐 필터링

uv 좌표값에 의해 텍스쳐의 텍셀값을 읽어오는데, 이 때 읽어오는 텍셀값을 결정하기 위해 필터링이라는 기법을 사용한다.

텍스쳐에서 텍셀을 읽어올 때 필연적으로 계단 현상이 생기는데, 필터링은 이러한 계단 현상을 막기 위해서 텍스쳐 필터를 사용하게 된다.


텍스쳐 필터의 종류

필터의 종류                             효과                                              명칭               

D3DTEXF_NONE                     필터를 사용하지 않음                  

D3DTEXF_POINT                    최근점 샘플링                                   최근점 샘플링

D3DTEXF_LINEAR                  선택된 텍셀의 상하좌우 픽셀의 평균값

D3DTEXF_ANISOTROPIC         텍스쳐 왜곡 현상을 해결하기 위해        이방성 필터링

                                           보간할 때 여러 픽셀을 취해서 얻는 값

                                          (그래픽 카드에 따라 다르다)

D3DTEXF_PYRAMIDALQUAD  피라미드 형태로 4개의 샘플을 취한 값    피라미드 쿼드

D3DTEXF_GAUSSIANQUAD    샘플 네개의 가우스 필터 값                   가우시안 쿼드



멀티 텍스쳐

말 그대로 다중 텍스쳐, 여러장의 텍스쳐를 말하는 것

하나의 폴리곤이 그려질 때 여러장의 텍스쳐가 중첩되어 출력될 수 있다는 말이다.

중첩해서 출력하기 위한 텍스쳐가 임시로 보관되는 영역을 텍스쳐 스테이지라고 하는데, Direct 3D에는 총 8개의 텍스쳐 스테이지가 준비되어 있다.

결과적으로 Direct 3D는 8장의 텍스쳐를 겹쳐서 출력할 수 있으나, 실제로는 그래픽카드때문에 2~4장 정도 겹쳐서 출력하는게 일반적이다.



시스템적 제한

그래픽 카드가 8장의 스테이지를 지원하더라도 출력 순간에 결합할 수 있는 스테이지의 개수에는 제한이 있으므로 개발자는 반드시 지원하려는 그래픽카드의 DX Caps를 확인해야한다

 8개 스테이지를 지원하고, 동시에 사용 가능한 텍스쳐도 8개..



작동원리


 합성이 8개까지 끝나면 합성된 값을 폴리곤에 출력하는 방식이다.

왜 8개인줄은 알겠지요?


Direct 3D의 SetTextureStageState() 함수가 이러한 텍스쳐 설정을 담당한다.


다음의 소스는 이러한 연산의 대표적인 예를들면 


// 0번 텍스쳐 스테이지의 컬러 합성 연산 정의(D3DTSS_COLORP), Modulate 연산으로 합성

pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);

// 컬러합성 연산의 첫번째 전달 인자, 첫번째 인자는 텍스쳐의 컬러값(TEXTURE)

pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);

// 컬러합성 연산의 두번째 전달 인자, 두번째 인자는 텍스쳐 정점의 확산광 색깔(DIFFUSE)

pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);


라이트맵핑에 나올 예제지만

D3DTOP_MODULATE로 텍스쳐를 합성한 결과다

 요런거

신기방기


'Graphics > DirectX' 카테고리의 다른 글

Direct 3D - 빌보드  (0) 2014.07.24
Direct 3D - 라이트 맵핑  (0) 2014.07.23
Direct 3D - 조명모델  (0) 2014.07.12
Direct 3D - 사원수 (Quaternion)  (0) 2014.07.08
Direct 3D - 렌더링 파이프라인  (1) 2014.06.19