2. 왜 물은 물처럼 보이는 걸까?

반응형

이 글은 이전글(http://mgun.tistory.com/1282)을 먼저 읽어 보시는게 정신 건강에 좋습니다.

물의 잔물결을 표현하고자 오프라인으로 생성한 법선맵을 이용한다고 하였다.
하지만 이 방법은 법선맵을 여러번 쓰는 것이기 때문에 패턴의 반복이 보일 수 밖에 없다.
그렇다고 법선맵의 스케일을 줘서 크게 써버리면 잔물결 처럼 보이지 않게 되어 버린다.
그래서 해결책 중 하나를 소개하자면 하나의 법선맵을 여러번 스케일 해서 섞어서 쓰는 방식이다.
이는 Ogre의 샘플중 "Ocean"의 코드를 보면 알 수 있다.

게임이 물에 대한 의존성이 높고 사양도 따라준다면 조금 더 욕심을 내 볼 수 있을 것이다.
즉, 오프라인으로 미리 만들어 둔 법선맵을 사용하는 대신 동적으로 법선맵을 생성해서 사용하면 된다.
법선맵은 높이맵으로부터 만들 수 있는데 결국은 높이맵부터 동적으로 생성해 줘야 한다.

법선맵에 대한 설명은 개인적으로 사랑하는 책인 "Directx9 셰이더 프로그래밍"을 참고하거나
멋진 내용들로 가득한 Allosha님의 http://allosha.tistory.com/14 글을 참고하면 된다.

잔물결의 높이맵 생성에는 동적인 파동 시뮬레이션을 실시할 필요가 있는데 베를레 적분법을 사용한다.
베를레 적분법은 천의 시뮬레이션에서도 사용되어 졌는데 항상 멋진 번역글을 게재해 주시는
풍풍풍님의 http://blog.naver.com/sorkelf/40152048991 , http://blog.naver.com/sorkelf/40144340349
등의 글들을 한번 읽어보는 것도 좋을 것 같다.

추가적으로 GPG책에도 관련 내용이 있는데 "벌레뜨"라는 글을 검색해 보면 될 것 같다.
http://www.gpgstudy.com/gpgindex/#i7-88

nvidia에 demo 프로그램도 제공되는 한번 보면 좋을 듯..
http://www.nvidia.com/object/demo_tidepool.html

베를레 적분은 이전 상태와 현재 상태의 차분 정보로부터 속도를 산출해 다음 상태를 구하는 이산적인 방법으로
GPU가 텍스쳐에 대해 실행하는 연산모델에 적합하기 때문에 많이 이용된다.

이제 슬슬 핵심으로 넘어가 봐야 할 듯 하다.
앞의 글은 어느정도 서두의 내용이었고 실제로 하고 싶은 이야기는 지금부터 인데...
물을 물처럼 보이도록 하는 두가지 요소가 앞의 글의 첫 부분에 시각적인 부분 + 물리적인 부분이 있다고 했다.

시각적인 부분에서의 물은 투명하기 때문에 아래 밑 바닥이 보이는 투과현상이 있고
주위 환경이 반사되어 보이고 잔물결에 빛이 반짝 거리는 모습도 보인다.
물의 움직임에 따라 물에 반사된 모습이 울렁이게 보이기도 한다.
추가적으로  물거품도 있을 수 있고 몇가지 더 있을 수 있겠지만 요정도만 해보자..


위의 물을 보면 주위 환경을 비추어서 그대로 반사(reflection)되는데 물의 물결에 따라 울렁(굴절 refraction)되어 보인다.


위의 물은 물의 바닥부분이 투과(transmission)되어 보인다.


이 물은 거울과 같이 깨끗한 반사파문(ripple)을 보여준다.

물을 물처럼 보이게 하는 시각적인 특성은 위와 같다.
물은 항상 물 표면(surface)을 가진다.
이 말은 물과 물 외부를 나누는 물 표면(surface)가 있고 이를 경계로 서로 다른 매질이기 때문의 빛의 이동이 다르다는 말이다.
물 표면은 빛을 어떻게 반사하는가?
Reflection란 말은 한 표면의 한쪽면으로 들어오는 빛이 같은 쪽 면으로 반사되어 나가는 현상이며
들어오는 면과 반대쪽 면으로 나가는 현상을 Transmission이라고 한다.


가운데 물 표면이 있다고 가정할 때 들어오는 빛 Incident Light Beam이 있고 이 빛이 물의 표면을 때리면서
같은 쪽 면으로 반사되어 나가는 BRDF, 그리고 반대쪽 면으로 반사되어 나가는 BTDF가 있다.

반사되어 나가는 부분(BRDF)과 그리고 투과되어 나가는 부분(BTDF)으로로
크게 나눌 수 있으며 이들 상위 집합의 개념으로 BSDF(Bidirectional Reflectance Distributing Function)이 있다.

이에 관한 공식들이나 현상들은 http://jeddli.tistory.com/entry/BRDF 이 곳을 보면 상당히 잘 설명되어 있다.
간단하게 나마 몇가지 이야기 해 보자면...
- 한 방향으로 들어오는 빛에 대해 다른 방향으로 반사되어 나가는 빛의 양은 들어오는 빛에 비례한다.
  (들어오는게 많으면 그만큼 나가는 것도 많다)
- 표면의 재질이 들어오는 빛의 방향에 따라 다른 반사율을 가진다.  (거울 같은건 제외 되겠지..)
- 반사되는 양은 항상 입사 양 보다 작다. (물론 거울 제외...)

이에 대한 세부 좀 더 깊이 있는 내용은 http://mgun.tistory.com/1290을 참고.

용어가 좀 어려워 졌는데 BRDF니 BTDF니 이런 용어가 나오는 이유는 lighting 때문이다.
lighting의 성질을 게임에서 보다 사실적으로 사용하기 위해 알아야 하는 녀석이다.



*ps - 위 이미지들은 대부분 직접 만들려고 했지만 퍼온것도 있습니다. 이익창출의 목적이 아니니 이해해 주세유~!
- 잘못 설명된 부분이 있거나 이상한 부분이 있으면 과감한 지적질 감사유~!

'Study > M's Lecture' 카테고리의 다른 글

4. 왜 물은 물처럼 보이는 걸까?  (2) 2013.01.28
3. 왜 물은 물처럼 보이는 걸까?  (0) 2013.01.17
1. 왜 물은 물처럼 보이는 걸까?  (0) 2012.12.14
감마 보정 (gamma correction)  (0) 2012.02.27
벡터  (0) 2012.02.10
TAGS.

Comments