SSE를 이용한 4샘플 무분기 치환 for SW Occlusion Culling

요 근래에 Voxel 오브젝트 컬링을 위해 SW Occlusion Culling을 사용한다고 포스팅 했었다. SW Occlusion Culling이라봐야 별거 없다. 잠깐 그 내용을 상기해보면… CPU측에서 사용할 수 있는 Z-Buffer(그냥 32bits float타입의 메모리 버퍼)를 잡는다. Voxel오브젝트의 Min박스의 z값을 그린다. z값이 기존 값보다 작거나 같을 경우만 덮어쓴다. 이후에 테스트할 다른 Voxel오브젝트의 Max 박스의 z값을 z-buffer의 값과 비교한다. 기존값보다 z값이 작으면 … More SSE를 이용한 4샘플 무분기 치환 for SW Occlusion Culling

Engine Dev – Deferred Shading적용

D3D12엔진을 Forward Shading에서 Deferred Shading체계로 바꿨다. 아니 정확히는 Lighting은 Forward로 두고, 그림자 처리는 Deferred로 바꿨다. 부분적이지만 Deferred Shading으로 바꾼 이유는 대량의 Voxel을 출력할때 self-shadow를 적용하면 forward에선 와장창 느려지기 때문이다. 사실상 상당히 많은 voxel들이 가려져서 보이지 않음에도 불구하고 보이지 않는 voxel들까지도 depth-test를 하고 있는게 꽤 심각한 성능저하를 가져왔다. 이 부분은 Deferred Shading으로 바꾸고 확실한 속도향상을 기대하고 있다. … More Engine Dev – Deferred Shading적용

GetTickCount() -> GetTickCount64()로 변경하기.

1. Redstone에선 UWP에서 IOCP를 쓸 수 있다. 그래서 개발중인 프로젝트의 UWP버전에서 StreamSocket을 사용한 네트워크코드를 걷어내고 IOCP기반의 win32코드로 교체하기로 결정. 2. 코드 고치다보니 GetTickCount()가 거슬림. PC가 부팅되고 최대 47일밖에 보장이 안되는 카운터라 안그래도 계속 바꾸려고 생각하고 있었음. 좋다. GetTickCount64()로 바꾸자. 3. 이게 조심해서 고쳐야 하는게  4바이트에서 8바이트로 사이즈가 증가하는거라 메모리 옵셋으로 다루는 부분이 있는지 확인하고 언더플로우나 … More GetTickCount() -> GetTickCount64()로 변경하기.

Windows 10 Redstone의 UWP에서 IOCP사용 가능.

예전에도 언급했지만 Windows 10 Redstone에선 UWP에서도 IOCP사용가능하다. 예전에 만들었던 IOCP 네트워크 라이브러리를 UWP로 포팅완료했다. 잘 작동한다. 수정한 코드는 클라이언트에서 사용시 소켓이벤트를 통보하기 위한 HWND와 PostMessage()를 CoreDispatcher와 람다함수로 바꾼것 뿐. 스레드와 winsock코드는 한줄도 안고치고 빌드 성공. 이제 UWP로 서버도 만들 수 있다.… 만세~

Clipping Triangle for SW Occlusion Culling

어제 x:-1 – +1, y:-1 – +1, z:0 – +1 볼륨에 대해 삼각형 클리핑 코드를 완성했고 잘 작동함을 확인했다. 그런데 카메라 돌리다보면 삼각형이 사라지거나 원래 삼각형의 빗면과 같은 기울기로 엉뚱한 곳에 삼각형이 나타나는 현상이 발생함. 원인 찾느라 엄청 해맸다. [원인] 커다란 삼각형의 점 일부가 카메라 뒷쪽으로 가는 경우, 프로젝션하고 보면 w값이 음수가 나옴. 이 경우 … More Clipping Triangle for SW Occlusion Culling

SW Occlusion Culling

아직 완전하지는 않지만 엔진에 SW Occlusion Culling기능을 넣었다. 물론 HW Occlusion Culling이 가능하다. Compute Shader를 이용한 HW Occlusion Culling과 D3DQuery를 이용한 HW Occlusion Culling기능도 이미 오래 전에 만들어놨다. 그런데 왜 SW Occlusion Culling기능을 따로 만들었는가..하면 렌더링을 위해 KD-Tree를 탐색하며 뷰프러스텀에 들어가는 복셀 오브젝트들을 탐색한다. 뷰프러스텀에 들어가는 오브젝트만 골라내도 사실 그 수가 적지 않다. 트리 순회 … More SW Occlusion Culling

Object Culling #1

네트워크 플레이의 기본 구조는 제대로 구현했다. 이제 플레이 가능한 속도를 보장할수 있도록 오브젝트 컬링을 위한 작업에 들어갔다. 우선 월드를 KD-Tree로 분할해서 복셀 오브젝트들을 집어넣었다. 뷰프러스텀에 들어가는 오브젝트를 찾을때 상위노드부터 제거하므로 탐색 효율은 확실히 좋아졌다. 하지만 이것만으론 많이 부족하다. 역시 가려진 오브젝트를 그리지 않도록 하는것이 가장 중요하다. 예전에 사용했던 Room/Portal/BSP방식도 이번엔 사용할 수 없다. 지형이 실시간으로 … More Object Culling #1

Game Dev – XBOX ONE(UWP버전)과 PC의 네트워크 플레이

이전에도 계속 포스팅했다시피 난 이 게임(데모)를 Windows Store를 통해 공개할 생각이다. 따라서 엔진을 개발할때부터 UWP버전을 같이 작업해왔다. 그리고 가능하면 XBOX ONE과 Windows 10 Phone에서도 동일한 게임을 플레이하게 하려고 나름 노력하고 있다. 몇 개월전 MS는 하나의 Store를 강조하며 XBOX ONE에서 UWP App을 돌릴 수 있게 하겠다고 발표했다. 얼마 지나지 않아서 프리뷰지만 XBOX ONE에서 UWP App을 돌릴 … More Game Dev – XBOX ONE(UWP버전)과 PC의 네트워크 플레이

모바일 GPU 관련 오늘의 교훈.

모바일 GPU(Adreno 430)에서 Compute Shader를 호출할때 Group 개수를 0으로 세팅하면 GPU 익셉션 발생. 그 여파로 DirectX Device를 더 이상 사용할 수 없게 된다.(Error:D3DDevice removed). 이건 퀄컴 GPU만의 문제일것도 아닐것이고 DirectX만의 문제도 아닐것이다. 비슷한 케이스의 문제라면 모든 모바일 GPU가 해당되리라 예상한다. Group 개수를 0으로 해서 호출하는건 바보짓이지만 그렇다고 GPU에서 익셉션을 발생시킬 정도의 치명적인 에러는 아니라고 생각하는데. … More 모바일 GPU 관련 오늘의 교훈.