분류 전체보기
[DirectX 11] Hierarchical Z-Buffer Occlusion Culling
Hardware Occlusion Culling 1) 구현 원리 - Occluder가 Rendering 된 상태에서 (Z-Buffer 유지 상태) Occludee를 Rendering 하여Pixel에 그려지는지 테스트 하는 방식. - Low-Poly Data나 Bounding Mesh를 그려서 Z-Buffer를 구성한다. - Occludee를Pixel Write를 하지 않고 Z-Test만 한다. - 그려지는 Pixel 수를 GPU측 메모리에 기록해둔다. - 해당 Occludee의Pixel 수를 GPU로부터 얻어온다. 2) 단점 - DrawCall 회수를 줄이지 못한다. - 두번 그려야 하므로 왠만해선 빨라지기 힘들다. - Occludee의크기가 커질수록 Z-Test 회수도 많아진다. - Pixel 수를 받..
[DirectX 11] Fast Picking (Object ID Picking)
Object ID Picking - Object Picking을 하기위해선 화면상의 현재 Mouse Position에 위치하는 Face를 모두 검사하는 방식을 사용했었는데, 생각해보니 굳이 CPU 측에서 모든 Object의 Face를 검색하는 것보단 간단한 Object ID를 화면상에 그리는 방식이 빠를것이라 생각이 들었다. Staging Buffer를 활용하면 해당 영역의 GPU Resource Data를 Copy 할 수 있다는 것을 알게되어 활용해보기로 하였다. Picking 방식 - Object 생성시 부여되는 고유 Number를 활용하여 Hash Color를 생성 - Picking Event 실행시 화면상에 모든 Object Hash Color를 Draw 실행 - Staging Buffer를 통해..
[DirectX 11] Game Engine Render Resource 동기화 방식 및 Resource 관리 방식
Game Engine Render Resource 동기화 방식 및 Resource 관리 방식 void* 형태로 서로 알고 있을경우 Resource 동기화는 어떻게 할 것인가 - 추가되는 Resource 뿐만 아니라 변경되는 Resource는 즉시 처리하는 방식이 아닌 Graphic 측에서 현재 프레임에 추가 및 변경 된 Resource는 각각의 Queue에 보관해둔 뒤 실질적인 Rendering이 실행되기 전 변환을 하여 Instance Layer를 재구성을 한 후에 Rendering을 실행한다. - 동기화 부분에 대해서 많은 고민을 해보았지만 해당 Resource가 변경될 시점마다 Graphic 측에 알려주어 동기화 하는 방식이 단순하면서도 깔끔할 것이라는 생각이 들어 해당 Resource가 변경 될때..
[DirectX 11] Game Engine & Graphic Engine 분리 및 Render Data 전달 방식
Game Engine & Graphic Engine - 프로젝트를 시작한지는 좀 됬지만 어느정도 구조가 확립이 되어 정리해보려고 한다. 일단 Engine 구조를 Client Programmer와 생각하면서 중요하게 생각한 부분이 몇가지 있다. 1) Game Engine은 어떤 Graphic Engine이건 상관없이 동작을 해야한다. 2) Game Engine과 Graphic Engine은 독립적이여야 한다. 3) 데이터 전달 과정에서 어느 한 부분에 종속적인 데이터가 있으면 안된다. 4) 공유 데이터를 통해 Game Engine과 Graphic Engine은 각자 필요한 동작을 실행한다. Game Engine과 Graphic Engine이 독립적이여야 하는 이유 - 현재 프로젝트에선 DirectX 11을..
[DirectX 11] Hardware Instancing
Hardware Instancing - Hareware Instancing이란 Second Vertex Buffer를 활용하여 해당 Vertex Buffer를 필요로하는 Instance들의 추가적인 변환 Data를 Instance Buffer를 통해 Vertex Shader 측에서 한번의 Draw Call로 여러개의 Instance를 그리는 방식이다. Instancing 장점 1) 같은 Vertex Buffer를 사용함에도 매번 해당 Instance Data를 Constant Buffer에 Update하여 Draw Call을 호출하는 것은병목 현상을 유발하는데, 이러한 Instance Data를 Instance Buffer에 Copy하여 Cache해둔 Vertex Buffer와 수정된Instance Bu..
[DirectX 11] Deferred Fog
Deferred Fog - 프로젝트 진행중 아트측 요청으로인해 거리기반, 높이기반 Fog가 필요하여 후처리 Fog를 구현하는 도중 움직이는 효과가 있으면 조금 더 자연스럽겠다는 생각에 Perin Noise 3D Texture를 활용하여 제작하였다. Distance Fog - Fog를 표현할 설정한 시작 지점부터 점점 Fog가 진해지도록 하였다. Height Fog - 맵 위에선 얕게 바닥에 깔리는 느낌을 주기위해 해당 범위의 높이에서만 표현되도록 하였다. - 맵 외의 멀리 있는 부분은 전체적으로 설정한 높이를 기준으로 높이가 낮아질수록 Fog가 진해지도록 하였다. Perin Noise Texture 3D - 미리 생성해둔 Perin Noise Texture 3D를 활용하여 해당 Object의 Positi..
[DirectX 11] Bloom
Bloom - 카메라 렌즈에 빛이 들어올 때 카메라가 100% 정확히 그 빛의 정보를 담아내지 못하기 때문에, 태양과 같이 강렬한 빛을 찍으면 실제로 보이는 빛보다 더 큰 면적으로 찍히게 됩니다. 이런 현상은 마치 빛이 퍼져보이는 것과 같은 효과를 나타냅니다. 이것을 흉내내서 처리하는 것을 Bloom 효과라고 합니다. - 위의 효과를 내기위에선 몇가지 단계가 필요한데, 그저 밝은 Pixel을 추출하여 Blur 효과만으론 번지는 효과를 나타내기 힘듭니다. 따라서 번지는 효과를 주기 위해 몇번의 Down Sampling과 Up Sampling을 통하여 이미지 합성을 통해 번지는 효과를 나타낼 수 있습니다. Bloom 적용 방식 1) 원본 RenderTarget에서 Bloom Curve를 통해 Bright 영..
[DirectX 11] Lambert / Half Lambert
Lambert / Half Lambert - Lambert 방식으로 Lighting 연산을 하게되면 Normal Vector와 Light Direction Vector을 내적하였을때 0 이하의 값은 급격하게 어두워지는 현상이 나타날 수 밖에 없게 되는데 이러한 어두움 표현을 자연스럽게 없애기 위한 방식이 Half Lambert이다. - 일반적인 Dot 연산은 -1 ~ 1 까지의 표현이 가능한데 -1 ~ 0 까지의 결과 값은 어둡게 처리되게 된다. Half Lambert는 해당 결과 값에 0.5를 곱한 후 0.5를 더하여 0 ~ 1 범위로 표현하도록 하는 것이다.