[포니 게임 개발] 33. 타일맵 개선 & 노말매핑 & 하드웨어 인스턴싱

Posted by 적분 ∫2tdt=t²+c
2013.08.31 06:40 프로그래밍/포니게임개발



며칠 작업한 내역은 주로 타일맵을 개선하는데 집중되었습니다. 로우 폴리곤으로 밋밋한 지형을 보강하고자 노말매핑을 적용시켰고, 많은 인스턴스를 그릴때 DP콜을 낮추기 위한 하드웨어 인스턴싱을 적용했습니다. 그리고 레벨 편집기에서도 타일맵을 생성하고 수정할수 있도록 프로그램을 강화했죠.





1. 노말 매핑

* 그동안 노말매핑을 적용하고 싶었는데, 탄젠트 공간 노말맵을 제대로 이해하지 못하고 있어서 잘 적용시키지 못했습니다. 검색을 통해 노말맵에 대해 이해하게 된 바로는


1) 노말 매핑을 위해서는 노말(normal) 벡터, 탄젠트(tangent) 벡터, 바이노말(binormal) 벡터가 필요하다. 이중 바이노말 벡터는 노말 벡터와 탄젠트 벡터의 외적을 통해서 얻을 수 있다.

2) 노말 벡터는 해당 버텍스의 법선방향과 일치해야한다. 탄젠트 벡터는 해당 버텍스의 수 많은 접선 중 일부로, 또한 노말맵의 U방향과 일치해야 한다.

3) 바이노말 벡터 역시 해당 버텍스의 수 많은 접선 중 또 다른 하나로, 노말 벡터, 탄젠트 벡터 모두와 수직을 이루어야 한다. 또한 이 벡터는 노말맵의 V방향과 일치해야 한다. 하지만 왼손좌표계에서 외적을 통해 구할 경우 바이노말 벡터를 구할 경우 노말맵의 V방향과 반대로 되기 때문에, 처음부터 노말맵의 바이노말벡터 성분을 Invert해서 구워놓는 경우도 많다.

4) 노말맵에는 각각 탄젠트 벡터, 바이노말 벡터, 노말 벡터의 가중치를 R, G, B값으로 기록하여 저장해둔다. 이 세 벡터는 서로 수직인 기저벡터이므로, 이 세 벡터를 적절히 섞으면 모든 방향의 벡터를 나타낼 수 있다.


정도가 되는듯합니다. 겨우 적용시켰는데 생각보다 눈에 띄지는 않더라구요. 애초에 카툰 렌더링을 하다보니 세세한 요철 굴곡은 묻혀버리는 경우가 많아서, 빛이 비스듬하게 들어오는 경우가 아니면 큰 차이는 없네요. (그래도 굳이 차이를 강조시켜 보이게 하려고 레인보우 대시에게서 빛이 나가도록 설정했어요ㅋㅋ)


2. 하드웨어 인스턴싱

다이렉트9라는 한계 때문에 스키닝과 인스턴싱을 동시에 적용하기는 힘들고, 스키닝 따위는 없는 단순한 오브젝트들을 통합해서 한 큐에 그리도록 했습니다. SetStreamSourceFreq 함수를 호출해서 두 개의 스트림을 연결해 놓으면, 실제 렌더링 시에 두 개의 스트림의 모든 조합이 렌더링이 되는 방식이죠. 생각만큼 엄청난 성능 향상이 있었던 것은 아니지만, 최소 5프레임에서 높은 경우 10프레임 정도까지 빨라졌어요.



신고
이 댓글을 비밀 댓글로