알파 블렌딩 (Alpha Blending)

1. 방법
각각의 용도가 다르며, 경우에 따라서 조합되어 사용될 수 있다.
a. Material Alpha - Mesh 단위
주로 전체적으로 Mesh에 Alpha를 줄 때 사용
멀리 있어서 투명하게 사라져야 할 때 또는 플레이어와 카메라 사이에 낀 오브젝트일 경우 등에 게임적으로 조절되는 알파값을 주어서 투명하게 만든다.
출력용 Alpha = 게임상에서 조절되는 Alpha * 원본 Material의 Alpha
-> 출력용 Material = 게임상에서 수정되는 Material * 원본 Material(보통 수정하지 않음)
(Material 값으로 알파 처리를 하려면 라이트를 켜야한다)
b. Texture Alpha - Pixel 단위
한 Mesh내에 Pixel별로 Alpha가 다를 때 사용
c. TFactor 이용
Texture Factor의 Alpha값으로 기존 텍스쳐와 modulate하여 투명도 변경
d. Vertex 정보의 Color값을 이용하여 투명도 조절


2. TGA 파일을 이용한 렌더링
나무, 꽃, 펜스를 그냥 렌더링 했을 경우

알파 테스트를 켜고 알파 블렌딩
풀이나 나무를 렌더링 할 때, 먼저 알파 테스트로 나뭇잎을 제외한 부분을 걸러내고, 나뭇잎의 경계선을 부드럽게 외부 세계와 섞어주기 위해서 알파 블렌드를 사용한다.
g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x01);
g_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);

g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

나뭇잎,꽃,펜스와 같이 Plane으로 되어있는 오브젝트는 뒷면도 보여야하므로 back face culling을 하지 않음
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );


경계가 잘 빠지지 않는 문제는 D3DRS_ALPHAREF 값을 조절해줌으로 해결. (참조할 알파값을 넣어줘서 주어진 조건에 맞지 않는 알파 값이 들어간 픽셀을 렌더링에서 제외) D3DRS_ALPHAREF는 0x00000000 ~ 0x000000FF 사이의 값을 가질수있는데, 위의 상황에서는 이 값이 99 정도일때 가장 깔끔하게 렌더링 되었음. 이 값이 커지면 가장자리 부분이 많이 제거됨.
g_pd3dDevice->SetRenderState( D3DRS_ALPHAREF, (DWORD)0x00000099 );


TGA파일과 같이 알파채널을 이용하는 경우 외에도 검정색을 컬러키로 사용(검정색을 빼고 렌더링)한다면 블랜딩 셋팅만 바꿔주는 것으로 동일한 효과를 볼 수 있다.
SRCBLEND -> ONE , DESTBLEND -> ONE

3. 소트
알파 블렌드에서는 먼저 그려진 픽셀의 알파와 혼합을 하기 때문에 렌더링 순서가 중요하다. (멀리있는 것 부터 렌더링해야 제대로 나온다) 가령, 월드를 렌더링하기 전에 잎사귀를 그리고 월드를 렌더링 한다면, 잎사귀는 백 버퍼를 클리어한 색깔과 혼합이 된다. 따라서 알파를 쓴 물체를 그릴때는 Depth Sort 를 해주는 것이 일반적이다. 멀리 있는 물체부터 앞으로 그리는 방식으로 나중에 Alpha 가 있는 물체 사이에 다른 물체를 그리지 않도록 하는 것이다. 정렬 기준은 카메라와의 거리이다.

투명한 객체(Alpha-Blending Object)들은 따로 모아서 불투명한 객체(Non-Alpha-Blending Object) 렌더링이 끝난 직후 정렬하여 렌더링한다. (Depth 없이 배경에 그릴 물체 -> 알파가 없는 물체 -> 알파가 있는 물체 -> Effect 로 모든 것 위에 올라갈 물체 -> Depth 맨위에 그릴 UI 의 순으로 렌더링)

그래도 생기는 문제가 폴리곤 단위 소팅 문제이다. 이는ALPHATEST(컬러키)를 켜주고 더해서 ALPHAREF 값을 조금 높게(0xc0 정도) 주면 폴리곤 소팅을 하지 않아도 무리없이 보인다. 디자이너는 싫어하지만 투명에 의해서 뒤가 뚫려 보이는 것 보다는 훨씬 낫다.

머리카락이나 무기 등과 같은 섬세하면서 클로즈업 되는 곳은 알파소팅 하여 렌더링하고 이펙트나 나뭇잎처럼 뒤범벅 되는 것은 대충 z-buffer 끄고 렌더링해도 무난하다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by hans

2005/12/15 18:09 2005/12/15 18:09
, ,
Response
No Trackback , a comment
RSS :
http://hansnara.pe.kr/blog/rss/response/9

Trackback URL : http://hansnara.pe.kr/blog/trackback/9

Comments List

  1. kim 2011/10/14 01:08 # M/D Reply Permalink

    잘읽엇습니다 감사합니다

Leave a comment
[Login][OpenID?]
« Previous : 1 : ... 52 : 53 : 54 : 55 : 56 : 57 : 58 : 59 : Next »