블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (666)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total343,844
Today11
Yesterday82

이 글은 이전글(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
2. 왜 물은 물처럼 보이는 걸까?  (0) 2012.12.14
1. 왜 물은 물처럼 보이는 걸까?  (0) 2012.12.14
감마 보정 (gamma correction)  (0) 2012.02.27
벡터  (0) 2012.02.10
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함