프로그래밍 2015. 1. 30. 20:18
728x90

 

볼륨메트릭 라이팅 Volumetric Light - 01

 

 

테스트로 만들어본 샷들입니다.

 

라이트 광선의

샘플링갯수, 감쇄치, 밀도치 등을 변화시켜

부드럽게도,

와일드하게도

표현할 수 있습니다.

 

 

 

 

 

 

 

 

볼륨메트릭 라이팅의 구현은

GPUGems 3 권을 참고 하였습니다.

 

뭐,

코드를 그대로 배꼈습니다만,

뭐 건드릴 부분도 없어 보이더군요.

흐흐

 

처음에 구현을 고려했을때는

뭔가 좀 복잡해 보이고,

오브젝트의 깊이 정보,

가려지는 오브젝트들의 차폐 정보등의 필요성에 대해서, 

막연히 생각을 하고 있었습니다만,

 

결론적으로 말씀드리자면,

전혀 복잡하지 않더군요 !!

 

깊이 정보 등은 필요치 않고,

차폐정보는 가려질 오브젝트들을 렌더링 해놓은 텍스쳐 한장만 있으면

만사 해결입니다.

 

 

<준비물>

 

1. 오리지날 씬이 저장된 렌더타겟 텍스쳐

- 포스트 이펙트에 사용되는 최종적인 full scene 을 말합니다. 

 

2. 볼륨메트릭 라이트 처리에 필요한 렌더타겟 텍스쳐 (VL_RT )

- 발광체와 차폐물이 렌더링될 텍스쳐 입니다.

- 줄여서 VL_RT 로 표시하겠습니다.

 

3. 발광하는 오브젝트

- 월드좌표를 가지고, 실제 렌더링되는 오브젝트여야 합니다!

- sky 처럼 유저를 중심으로 일정 거리에서 따라다니는 태양도 좋고,

- 맵의 특정 영역에 만들어 둔 강한 발광체도 좋습니다. 

- 저의 경우는 유저를 중심으로, 일정 거리에서 따라다니는 달 오브젝트를 만들었습니다.

 

- 이 발광체의 색상이 그대로, 라이트빔의 색상이 됩니다.

 

 

<코드 부분>

 

VL_RT 시작

- VL_RT 는 완전블랙 0 으로 채워둡니다

- D3DDEVICE->Clear( 0, NULL, (D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER), 0x00000000, 1.f, 0 )

 

발광체 렌더링

- 자기 모습 그대로 렌더링해둡니다.

 

발광체를 가릴 차폐 오브젝트를 모두 렌더링

- 색상은 완전블랙, 알파값을 255로 렌더링해둡니다.

- 다시 설명드리자면 r,g,b 가 완전블랙인 단색으로 렌더링해줍니다.

 

VL_RT 끝

 

위 코드의 과정을 거치면,

발광체가 차폐물에 가려져 있는 텍스쳐가 만들어 집니다.

 

만들어 놓은,

VL_RT 이미지의 픽셀들을

특정방향으로 UV 좌표를 증가 또는 감소하면서,

특정갯수만큼 샘플링 시켜주면,

색상이 완만하게 변화하는

라이트 빔이 만들어집니다.

 

발광체의 영역은 색상이 있을 것이고,

차폐물의 영역은 완전한 블랙이기 때문에,

샘플링 과정을 거치면,

픽셀들은 자신의 주위 색상을 합산한 컬러를 가지게 되겠지요.

최종적으로는 빔의 형태로 나타나게 됩니다.

 

이 컬러들을

오리지날씬에 더해주면 끝입니다 !

그럴듯한 볼륨메트릭 라이트 효과를 볼수 있습니다.

 

다음장에서는 코드 부분에 대하여

좀더 세부적으로 설명드리겠습니다.

 

 

 

728x90

'프로그래밍' 카테고리의 다른 글

쉐이더 그림자 vsm pcf - 01  (0) 2015.03.10
볼륨메트릭 라이팅 Volumetric Light - 02  (0) 2015.01.30
셰이더로 구현한 화면 노이즈  (0) 2015.01.23
c++ tick  (0) 2014.11.23
d3d device lost, device reset  (0) 2014.10.07
posted by BK dddDang
: