반응형

http://cafe.naver.com/jzsdn/3286




게임 이펙트를 구현하시려고 하는분을 위해 간략히 써봅니다.

제가 하는 이야기가 무슨말인지 경험자분들은 대개 알고 계실거라 생각됩니다.

 

아시는 분은 아시겠지만... 일반적으로 게임 오브젝트를 렌더링 할경우

비알파 오브젝트를 먼저 렌더링하고 알파적용 오브젝트를 렌더링하게 됩니다.

 

 

그래야 알파적용 오브젝트가 비알파 오브젝트를 뒷배경으로 알파블렌딩 효과를

나타내기 때문이죠...

 

 

대개의 이펙트 효과는 반투명(알파 블렌딩) 의 효과를 가진게 많이 존재합니다.

 

일반적으로 여러개의 알파적용 오브젝트를 렌더링 할 경우에는 카메라와 거리를 재서

먼것부터 그려나가기 시작하죠

 

그래야 블렌딩 효과가 적용되기 때문입니다. 가까운것을 먼저그리게 되면

멀리 있는 오브젝트를 가까이 있는 오브젝트가 블렌딩하지 못하게됩니다.

게다가 뒷쪽에 오브젝트는 Z버퍼에 위해 걸러지게 되어 전체적으로

이상한 형상을 뛰게됩니다. 

 

 

여기까지는 아마 대개 렌더링 정책에 관한 이야기로 이미 알고 계신분들도 많으실겁니다 ^^;

 

 

이펙트를 구현하다보면 현실적으로 수많은 이펙트 메쉬들을 전부다 카메라와 거리를 통해

그려나간다는것은 불가능하다고 봐야겠죠... ^^

 

게다가 원통형의 마법형태를 구현하려고 하면 반정도가 이상한 모습을 뛴 모양이 나오게

될겁니다.

 

이런것들을 한방에 해결하게 해주는 요소가 바로 렌더링설정에서 D3DRS_ZWRITEENABLE

FALSE로 설정하는 것입니다.

 

비알파 오브젝트를 먼저 렌더링하게 되면  Z버퍼에 상에 비알파 오브젝트에 대한 사항이

먼저 적용됩니다. (여기서도 비알파 오브젝트는 먼저 그려져야 합니다. ^^)

여기서는 D3DRS_ZWRITEENABLE가 물론 TRUE겠죠.

 

D3DRS_ZWRITEENABLE을 FASLE로 설정하고 이펙트를 렌더링하게 되면

Z버퍼를 갱신하지않고 렌더링이 적용되게 되죠. 그래서 가까이있는게

먼저 그려진다고 하더라도 이 가까운 메쉬에 위해 Z버퍼가 갱신되지 않게됩니다.

 

 

순차적으로 접근해보면....(다시 수정)

1. 가까운 메쉬가 그려진다. (Z버퍼가 갱신되지 않고 가장 먼상태로 그대로 유지된다.)

2. 먼 메쉬가 그려진다. ( Z버퍼가 갱신되지 않고 먼상태이기에 먼 메쉬도 그려진다.)

 

 

이상황에서 블렌딩을 적용하게 되면 자연스럽게 두색상이 적당히 혼합되 뒤쪽에 있는 메쉬를

가까이 있는 메쉬가 비추는듯한 효과가 생기게 되는거지요.

 

만약 이펙트가 비알파 오브젝트 뒤쪽에 존재한다면.. 이미 비알파오브젝트를 렌더링하고

Z버퍼는 비알파 오브젝트에 위해 갱신된값을 가지기 때문에

그려지지 않게됩니다. (이게 바로 Z버퍼를 끄지않고 D3DRS_ZWRITEENABLE를 사용하는 이유입니다.)

 

해당 아티클을 적용할시에 대개 블렌딩 모드를

 

lDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);   
lDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

 

lDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);   
lDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

 

lDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);   
lDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA);

 

lDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);   
lDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA);

 

이 넷중에 하나로 설정할때 사용합니다. 

반응형

+ Recent posts