프로그래밍 2016. 10. 20. 23:22
728x90

 

volume fog - 구현 정리중

 

우오오오, 잔 작업이 드럽게 많다

수정하고, 또 돌려보고, 수정하고 또 돌려보고

며칠동안 계속 끈질기게 해대니, 조금씩 봐줄만하게 변해간다 

 

---

맵 6작업이 예정보다 일찍 끝나서,

이전부터 관심이 있던, 볼륨 포그를 구현해 보았다

 

빈 공간을 어떤식으로 채울까라는 생각에, 매우 궁금했던 부분이기도 했다

물론 거리 포그를 적용하면, 거리에 따라 공간이 채워지는 듯이 보이기도 하지만,

이건 공간을 채운다는 개념보다는,

모델의 렌더링시 컬러값에 포그식을 적용시키는 것으로,

완전히 비어있는 어떤 공간에 특별한 색상을 주는 것과는 다르다

 

볼륨포그는 모델이 없는 특정 영역만에 공간감을 주는 것으로,

뭔가 특별한 것으로 생각이 들었달까

 

속이 비어있는 정육면체가 있다고 하자 (게임의 모델은 모두 속이 비어있다)

이 속으로 들어가면 어떻게 보일까?

당연히, 속은 비어있고 껍데기가 보인다,

껍데기와 나 사이에 뭔가가 채워져 있지 않기 때문에,

정육면체의 속에서는 볼륨감이 느껴지지 않는다 

 

이 빈 속을 프로그래밍적으로 어떻게 채워서 공간감을 느끼게 할것인가?

이것이 나에게는 매우 궁금한 부분이기도 했다

 

볼륨 포그를 이용하면, 모델의 속을 채울수 있다

물론, 단색으로 표현이 되지만, 비어있는 속에 공간감을 줄수있다

외곽으로 갈수록 밀도가 변하게 처리하면, 색상이 부드럽게 옅어지게 처리할수 있다

 

음, 생각해보니,

게임상의 모든 모델의 속을 볼륨포그를 이용해서, 채우는 것도 가능할것 같다

카메라가 모델 속에 들어가면, 아주 진한 안개가 낀것처럼 출력시키는 것.

물론, 카메라가 모델속에 들어가는 타이밍이 정확히 검출되어야 한다.

 

사실, 볼륨포그는 완전히 비어있는 공간에 짠하고 무엇인가 채워지는 개념이 아니다,

모델의 렌더링을 필요로 한다

정육면체의 공간을 채우려면, 정육면체를 draw

구의 공간을 채우려면, 구를 draw 해주어야 한다

 

깊이버퍼에 모델을 draw 시켜주는 것이다,

이 깊이버퍼를 이용해서 정육면체의 두께를 계산,

두께 * 색상값을 적용시키는 것.

 

 

 

 

위 이미지는, 큰 직사각형 두개를 별도의  볼륨깊이버퍼에 렌더링 시킨것이다

밀도값이 적정하게 주어지지 않아서, 알아보기 힘들수도 있겠는데,

하나는 레드, 하나는 그린 으로 채워주고

맞물리는 부분은 색이 더해져서 노랑이 되었다

 

물론 볼륨깊이버퍼에만 렌더링해주고, 실제 화면에는 렌더링 시키지 않았다.

최종 풀씬이미지와 합성해서, 위와 같이 출력되었다 

 

 

 

 

좀더 알아보기 쉽게

큰 직사각형 하나, 색상은 레드

볼륨의 영역을 벗어나는 나무나, 지형이 있어야만, 좀더 확실하게 확인이 된다

나무나 지형이 솟아오르는 부분은, 포그의 밀도가 낮게 처리된다

나무나 지형이 있는지를 알기 위해서는,

풀씬의 깊이값이 기록된 별도의 depth buffer 텍스쳐가 필요하다.

볼륨두께를 기록할때, 이 depth buffer 에서 깊이값을 읽어와서, 비교한후

볼륨두께를 조정해 준다

 

 

 

 

볼륨깊이버퍼의 크기를 전체화면의 1/4 크기로 사용하고 있다, 총 4개까지 사용

그래서 나무에 적용되는 포그가 스무드하지 않다

텍스쳐를 별도로 블러를 시키거나,

큰 사이즈의 텍스쳐를 별도로 만들어 카피해서 사용한다면,

깔끔하게 나올것도 같지만,

이렇게 볼륨 포그를 하다보면, 할일이 자꾸 생긴다

 

 

원래는 화면 크기에 맞추어서 하나만 사용을 했으나,

여러개의 볼륨포그가 겹쳐질때의 처리를 위해서는,

각각의 볼륨포그가 따로 렌더링될, 볼륨깊이버퍼가 필요하다고 결론을 지었다

( 하나의 볼륨깊이버퍼로는, 여러개의 볼륨포그가 겹칠때, 라인이 생기는 문제를 해결할수 없다, 내가 테스트 한바로는 )

 

 

 

볼륨포그 속으로 들어왔다

볼륨포그를 구현할때, 외부에서 포그를 보는것과

내부로 들어오는 것은, 별도로 코드를 나누어서 구성해 주어야 한다

 

 

 

좀더 가깝게 다가갔다

코드 구현에 따라, 밀도가 큰 부분을 외곽으로 줄지, 중심으로 줄지 나누어 줄수 있을듯도 한데...

 

다음 포스팅에서 계속

 

 

728x90
posted by BK dddDang
: