간단한 눈 처리

PvP 전용 던젼을 만들고 보스전을 개선해야하지만 전략적으로 어떻게 만들어야할지 설계가 도저히 떠오르지 않고, 의욕도 전혀 생기지 않는다.

안되는거 붙잡고 있어봐야 시간만 낭비고 짜증만 더 할 뿐이라 기분전환을 좀 하기로 했다.

과거로 돌아가서 대략 1년2개월쯤 전.

우리팀 막내 프로그래머 P씨가 입사할때 제출한 포폴을 보면 눈이 펄펄 내리고 있는데 상당히 그럴싸해보였다.

그 당시 구현방법을 물었고 우리 프로젝트에도 적용할 수 있겠다 싶어서 간단하게 샘플 코드를 작성해달라고 했다.

눈 오는 처리 자체는 특별히 어려울게 없었으나, 우리 프로젝트에 바로 적용하기엔 무리가 있었다.

우리 게임의 경우 실내/실외가 공존한다.

실내에서 실외를 볼 수 있고 실외에서 실내를 볼 수 있기 때문에 눈이 오는 처리를 생으로 할 경우 할 경우 실내 천장을 뚫고 눈이 펄펄 내리는 걸 볼 수 있다.

따라서 그 문제를 해결해야하는데,그 당시 같이 있었던 프로그래머 L씨가 의견을 냈다. 렌더타겟 잡고 위에서 맵 전체를 한방 찍어서 z값을 기록하고 그걸로 눈송이를 렌더링할지 판별하자는 것.

생각해보면 쉐도우맵이다.

아이디어가 그럴싸해서 그렇게 하면 되겠네…라고 생각했으나 일정이 바빠서 언젠가 넣어야지 하고 계속 미뤄왔었다.

그게 1년도 더 된 일이다.

요새처럼 미치도록 일하기 싫은 상태에서 스스로에게 동기를 부여할 방법이라곤 약간이라도 재밌는 코드를 짜는것.

그 밖에 화면발이 1%라도 나아지는걸 내 눈으로 확인할 수 있다면 약간 일할 의욕이 더 생기겠지.

눈발이 날리는 기능을 넣는다면 [재미있는 코드작성]과 [화면발의 1%이상 향상]의 두 마리 토끼를 모두 잡을 수 있다.

해서 그 동안 잊고 있던 눈처리를 제대로 넣기로 했다.

지난 주말에 과거 P군이 제공해준 샘플 코드를 참고하여 몇 시간만에 눈 오는 코드를 짰다.

렌더링 코드나 쉐이더 코드보다 엔진의 공간분할에 맞춰서 파티클 오브젝트를 구현하고 최대한 적은 리소스를 사용하게 만드는데 훨씬 많은 시간이 들어갔다.

주중에 몇 일은 TopView로 맵의 depth값을 렌더링하고 확인하는 코드를 짜고 디버깅했다.

목요일은 정기 테스트로 하루의 대부분을 날렸고 금요일에 depth텍스쳐를 참조하여 눈송이를 선별적으로 렌더링하는 쉐이더 코드를 작성해넣었다.

말했듯이 기본적인 아이디어는 쉐도우맵이랑 똑같다. 코드도 거의 같다.

오늘 늦잠자고 일어나니 집에서 뒹굴거리기 짜증나서 노트북을 들고 삼성동 탐앤탐스로 갔다.

100개의 버텍스로 구성된 파티클 오브젝트 하나를 재활용하다보니 생기는 눈송이의 규칙적인 패턴을 불규칙하게 보이도록 수정하고 몇 가지 코드들을 튜닝했다.

범용성을 높이는김에 툴에서 높이맵을 직접 추출할 수 있도록 툴 기능도 추가했다.

예전에 짜둔 코드를 리뷰하고 프로젝션 원리를 다시 한번 리프레쉬했다.

간만의 쉐이더 어셈블리 코드 작성도 재밌었고 화면발도 1%정도는 좋아진 것 같다.

스샷 몇 장 첨부한다.

대충 눈내리는 맵. 배경과 그닥 어울리진 않지만 좌우간 내린다.
b0c29a76e27cb00ddc8bbdba1821fd43
그 다음은 우주선 아래서 눈을 피할 수 있음을 보여준다. 즉 우주선의 TopView z값이 눈송이 z값보다 작기 때문에(월드좌표의 y값은 높기 때문에)눈송이를 렌더링 하지않는다.

1fa86f78d7eb95e5704ed9e6b1651708
그리고 z값을 렌더링한 텍스쳐.

9108b4cafd6f5d3488cfd3a646bcac97


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중