삼각형 베이스 맵에서의 SW Occlusion Culling #2

일반적인 삼각형 베이스 맵에서의 SW Occlusion Culling을 적용하고 있다. 현재는 Occluder로 사용할 삼각형을 따로 골라내지 않고 삼각형 그대로 SW Z-Buffer에 Rasterize한다. 오브젝트 단위로 culling하지 않고 다수의 오브젝트가 묶여있는 leaf의 AABB를 Z-Test하고 있다. 처음엔 Occluder로 사용할 삼각형을 미리 골라둘 생각이었으나 굳이 그럴 필요는 없을것 같다. SW Occlusion Culling단계에서는 leaf단위로 culling한다. HW Occlusion Culling단계에서 오브젝트 단위로 culling한다. … More 삼각형 베이스 맵에서의 SW Occlusion Culling #2

GPU를 이용한 PVS #4 – 게임 클라이언트 테스트

맵에디터가 아닌 게임 클라이언트에서의 테스트다. 오프라인 PVS빌드에 GPU 점유율 86%정도로 약 13분이 걸렸다. Voxelization에선 그나마 DX12버전이 약간 더 빨랐는데, 이 경우는 그냥 DX11이 더 빠르다. 더 정확히 얘기하면 DX11의 싱글스레드로 CPU점유율 20%, GPU점유율 86% – 13분(대략) 였고, DX12의 멀티스레드(6스레드)로 CPU점유율 90%, GPU점유율 100% – 13분 30초(대략) 이었다. DX12는 정말 답이 없다. 아마 AMD GPU였으면 그래도 … More GPU를 이용한 PVS #4 – 게임 클라이언트 테스트

GPU를 이용한 PVS #3.

현재까지 구현한 방법에는 약간의 문제가 있다. 그냥 딱 잘라 말하면 정밀도 문제다. 결과적으로 특정 공간에서 보여야할 오브젝트가 보이지 않는 현상이 일어난다. 정밀도를 높이면 높일수록 빌드시간이 길어진다. 정말 제대로 하려면 어마어마한 시간이 필요하다. 그래서 결국 지난 2주를 날렸구나..라고 생각했으나, 밑져야 본전이라는 생각으로 약간의 꼼수를 써봤다. 기존 방식대로 PVS를 계산하고(마을맵 하나에 15분), 이후 문제가 되는 공간들에 대해서만 … More GPU를 이용한 PVS #3.

GPU를 이용한 PVS계산 #2

정밀도 문제와 기타 등등 문제들이 있지만 의도한대로 작동은 한다. 영상의 앞부분은 PVS를 사용하지 않고 KD-Tree와 View Frustum culling만을 사용하여 렌더링. 당연히 가려지는 매시들을 상당수 그리고 있다. 뒷부분은 미리 계산한 가시성 테이블을 이용하여 렌더링. 100%는 아니지만 꽤 많은 수의 가려지는 매시들을(leaf단위로 잘려있는) 미리 걸러낸다. 조금 더 부연하면 KD-Tree를 타고 현재 카메라의 eye 점이 있는 leaf를 탐색. … More GPU를 이용한 PVS계산 #2

GPU를 이용한 PVS계산

[데모 설명] 카메라가 위치한 방에서 버튼을 눌러서 PvS를 계산한다. 이후 이 방으로부터 볼 수 있는 공간들은 노란색 와이어프레임으로 표시된다. 1. 월드 공간을 KD-Tree로 분할. 2. 삼각형과 교차하지 않는 공간이 leaf가 된다. 또는 특정 사이즈 이하로 공간이 작아지면 leaf가 된다. 3. leaf가 삼각형과 교차하는 경우 서브 트리로 분할. 서브트리에서 다시 삼각형과 교차하지 않는 leaf의 AABB만 수집 … More GPU를 이용한 PVS계산

nvapi에서 NvAPI_GetMemoryInfo()주소 얻어오기 – (어셈블리어 학습해야하나요?)

Voxel Horizon은 NVAPI를 사용한다. NVAPI는 GPU의 상태를 확인하거나 일부 기능을 제어할 수 있는 nvidia 그래픽 드라이버에서 제공하는 API이다. NVAPI SDK는 nvidia 개발자 홈페이지에서 다운로드할 수 있다. C스타일의 .h / .lib / .dll로 구성된 아주 간단한 SDK다. 이걸로 게임 플레이중 GPU점유율과 GPU온도, 남은 GPU메모리의 양을 확인한다. 물론 일반 유저들을 위한 기능은 아니고 개발할때 필요한 디버깅용 기능으로 … More nvapi에서 NvAPI_GetMemoryInfo()주소 얻어오기 – (어셈블리어 학습해야하나요?)

Baking Light-map. CUDA vs CPU

몇일전에 CUDA의 Unified Memory System에 문제가 있다고 포스팅했었다. CUDA Unified Memory 사용시 시스템이 멈춰버리는 현상. 아..아쉽다. 정말 멋진 기능이었는데. CUDA프로그래밍 해본 사람은 알텐데 cudaMalloc()으로 GPU메모리를, cudaMallocHost()로 CPU측 메모리를 할당하고 이 두가지 다른 메모리의 내용을 수동으로 동기화시키는 일은 상당히 번거롭다. 특히 Voxel Horizon프로젝트처럼 시스템 메모리에 구축한 KD-Tree를 GPU 메모리로 옮길땐 아주 짜증나는 작업을 해야한다. GPU측, CPU측 … More Baking Light-map. CUDA vs CPU