3D프로그래밍을 위한 위밍업 : 텍스쳐 블랜딩(Texture Blending) (DirectX9)

프로그래밍/3D프로그래밍 2006/09/08 23:48

3D프로그래밍을 위한 텍스쳐블렌딩 메모: Texture Blending
by Xevious7. http://www.xevious7.com
개인적복습 메모와 지식의 나눔을 위한 포스트
이 사람이 글을 쓰는 이유하나 http://www.xevious7.com/54

용어의 리뷰(review)

텍스쳐(Texture)라는 말은 영어의 본뜻은 직물이라는 뜻입니다. 어떤 표면이나
재료의 성질이나 결을 나타내는 말로도 쓰입니다.

3D그래픽에서의 텍스쳐는 폴리건(Polygon)의 표면에 입히는 이미지를 의미합니다.
즉 3D그래픽에서는 텍스쳐는 하나의 이미지입니다.
이 텍스쳐(이미지)의 픽셀하나를 텍셀(texel)이라고 합니다.

그리고 이 이미지를 폴리건 표면에 입히는 것을 텍스쳐맵핑(Texture Maping)이라고
합니다. 3D에서 폴리건에 텍스쳐맵핑은 매우 중요하기 때문에 대부분의 3D 그래픽
라이브러리에서는 텍스쳐맵핑을 손쉽게 할 수 있도록 함수들을 제공하고 있습니다.

텍스쳐맵핑 함수의 안쪽(Inside Texture Mapping function)

이 함수자체의 구현은 수학과도 관련된 부분이 있습니다.
즉 어떤 이미지를 폴리건의 표면에 입히는 작업을 수학적으로 말하보자면 ,
어떤 모양을 평면(Surface)에 입히는 것과 비슷한 작업이며 이것에 관한것은
고대로부터 연구되어져 왔습니다.

바닥을 어떤모양으로 채워넣을것인가 ? 벽면에 벽지를 어떻게 채울것인가의
문제이며 이것을 테셀레이션(Tessellation)이라고 하면 우리나라 사전에는
모자이크 세공(-.-)이라는 말로 나오더군요.

이미지를 어떤 평면에 매핑하는것은 결국 벽지를 벽면에 어떻게 채워넣는가와
근본적으로 같은 문제이기때문에 , 3D를 연구하는 컴퓨터과학자들은 이미 수학자들이
연구했던 수학이론과 공식을 사용하기도 하여 좀더 나은 알고리즘을 만들려고
노력합니다.

이러한 함수를 직접만드는 경우가 아니고 ,
이미 만들어진 3D그래픽 라이브러리를 사용하는 경우에는 이정도까지만 알아도
넘칠 것 같습니다.

>> 좀더 알아보려면 Tessellation 과 Pattern에 대해서 찾아보세요.
하지만 텍스쳐구현 함수들이 꼭 그러한 수학함수만으로 구현되는 것은 아닙니다.
어떤 함수의 구현이 여러가지 형태로 구현될 수 있는것처럼
원하는 것이 정해져있으므로 프로그래머 나름대로의 라직을 세워서 구현할 수
있고 그러한 방법에는 아주 많은 방법들이 있을 것입니다.

텍스쳐블랜딩이란?

위에서 이미 기본개념을 리뷰를 하였기 때문에 블랜딩(Blending)이라는 의미만
알면 바로 무엇인지 알수가 있습니다. 블랜딩은 섞다(blend)의 명사형입니다.
즉 텍스쳐 블랜딩은 텍스쳐를 섞는 것을 의미합니다.

좀더 3D 프로그래밍에서의 개념으로 보면 다음과 같습니다.
한개 이상의 텍스쳐를 서로 섞어서 텍스쳐 맵핑을 하는 것을 말합니다.

용어를 풀어서 적어보면

하나 이상의 이미지를 서로 섞어서 3D 폴리건의 표면에 입히는 것을 말합니다.

어떻게 블랜딩 할것인가는 텍스쳐블랜딩의 방법이 되겠습니다.
이 방법은 물론 API마다 틀리겠죠. 함수가 틀리니깐요.
이 텍스쳐블랜딩을 할때 만약알파값을 이용한다면 알파텍스쳐블렌딩 이라고
하겠지요.

DirectX 9.0 에서의 텍스쳐블랜딩

다음은 다이렉트X 9.0 문서파일을 기준으로 DirectX 9.0에서의 텍스쳐블랜딩을
정리해본 것입니다.

다이렉트X 9.0 문서파일에 의하면 Direct3D에서는 최대 8개의 텍스쳐까지
블랜딩을 할 수 있습니다.
실제로 자신의 하드웨어에서 몇개까지 가능한지는 그래픽카드의 사양에
따라서 달라질 것입니다. 따라서 텍스쳐블랜딩을 하기전에 이것을 먼저
검사하는 부분이 있어야 겠습니다. DxCapview 라는 DirectX 9.0 유틸리티를
통해서도 알 수 있습니다.


[그림] DxCapview 로 알아본 그래픽카드의 텍스쳐지원여부

위의 그림에서 보는 것처럼 TextureCaps 라는 항목을 보면 하드웨어와
DX9에서 지원하는 텍스쳐를 알 수 있습니다. 컴퓨터가 조금 된것이라
보시는 것처럼 Radeon7500을 쓰지만  모두 Yes 이군요 !.
요즈음 컴퓨터 대부분은 다 지원된다고 보아도 될 것 같습니다만 ,
안전한 동작을 위해서는 반드시 IDirect3DDevice9::GetDeviceCaps 함수를
이용하여 TextureCaps를 확인한 후에 텍스쳐블랜딩 함수를 사용하는 것이
바람직 할 것입니다.

Direct3D 의 텍스쳐블랜딩은 텍스쳐스테이지(texture stage)라는 것을 사용하여
텍스쳐블랜딩을 할 수 있습니다. MS가 아시다시피 미국회사라 API나 그 설명
또는 개념적인 이름등이 모두 영어이다보니 이것에 익숙하지 않는 사람들에게는
갑자기 나오는 용어때문에 이해력이 급격히 떨어지는 경우가 있습니다.
이해력이 떨어지면 집중력이 떨어지고 그러면 재미가 없어지게 되죠.
하지만 처음 배우는 단계는 모두 그렇습니다. 하지만 익숙해지면 단어들이
방긋 방긋 웃을 것입니다.

텍스처스테이지는 다음과 같이 동작합니다.


[그림] Dx9.0 에서의 텍스쳐스테이지와 텍스쳐블랜딩. 출처:MSDN

그림처럼 각각의 단계에서 텍스쳐블랜딩이 이루어집니다. 그 결과가 다시
다음 텍스쳐와 블랜딩됩니다. 이런형태로 블랜딩이 이루어지고 그 각각의
단계를 텍스쳐스테이지라고 부르는 것이죠.

각각의 스테이지에서 어떤형태로 서로 섞을 것인지를 정하는 동작방법과 옵션이 존재합니다.
IDirect3DDevice9::SetTextureStageState 메서드를 통하여 정할 수 있습니다.

Direct3D 의 텍스쳐블랜딩에 있어서 주의할 점은 Direct3D에서는 알파블랜딩과
칼라블랜딩을 따로 따로 구분합니다. 이것은 응용프로그램에서 블렌딩동작을 각각 동작에
대해서 알파와 칼라를 개별적으로 설정할 수 있다는 것을 의미합니다. 또한 이 설정은
다른 스테이지와는 독립적으로 적용됩니다.

텍스쳐스테이지에 대한 또하나의 노트는 상황에 따라서 텍스쳐스테이지의 갯수가
달라질때 그때마다 텍스쳐 스테이지 숫자를 조정하는 것보다  쓰지 않는 텍스쳐스테이지의
칼라옵션을 비활성화(disable)시키는 형태가 훨씬 낮다고 말하고 있습니다. 즉 텍스쳐
블렌딩에 사용되는 스테이지의 갯수가 최대 4개라면 4개를 계속 유지하고 어떤 오브젝트는
2개만 사용하는 경우에는 나머지 두개는 옵션을 통해 disable 하는 형태로 쓰는 것이
성능에 좋다고 말하고 있습니다.

경험상 사실 DirectX API뿐만 아니라 거의 모든 종류의 라이브러리에 있어서 설정또는
초기화관련 API들은 자주 쓰지 않고 , 전체에서 얼마나 쓰는지 미리 계산하여 쓰는것이
일반적으로 성능에 도움이 됩니다. 항상 그렇다라고는 말할 수 없습니다.

Direct3D에서의 텍스쳐블랜딩 간단 정리.

1. 텍스쳐를 생성하고 텍스쳐를 설정한다. d3dDevice->SetTexture 메서드
2. 블랜딩을 위한 텍스쳐스테이지를 생성하고 동작과 옵션을 정한다.
    d3dDevice->SetTextureStageState 메서드.

타입의 종류 링크.
D3DTEXTURESTAGESTATETYPE

top

Trackback Address :: http://www.xevious7.com/trackback/138

Write a comment