[DirectX 11] Material Property Block
·
Graphics
Material Property Block - 현재 같은 Mesh를 사용하는경우 Instancing을 통해 같은 Batch로 모아서 그리는 과정에서 특정 한 객체의 Material만 변경해야 할 경우를 처리하기 위해 Material Property Block을 도입하게 되었다. Material Property Block 동작 원리 - 현재 배치되어있는 Instance Batch는 유지하되, 현재 Material Property Block이 활성화된 시점 동안에만 잠시 다른 Batch로 빼서 따로 그리는 방식이다. - 현재 Instance Batch를 실시간으로 변경해주는 것보다 활성화된 시점에만 잠시 빼서 따로 그리는 방식이 효율적이라 생각이 들어 해당 방식으로 적용하였다. - 해당 객체의 Materia..
[Project] DirectX 11 3D Final Project
·
Project
DirectX 11 3D Project ( Eater ) DirectX 11 Engine Demo (2021.09.06 ~ 2022.07.01) Graphic 적용 기술 - Hierarchical Z Map Occlusion Culling [DirectX 11] Hierarchical Z Map Occlusion Culling Hardware Occlusion Culling 1) 구현 원리 - Occluder가 Rendering 된 상태에서 (Z-Buffer 유지 상태) Occludee를 Rendering 하여Pixel에 그려지는지 테스트 하는 방식. - Low-Poly Data나 Bounding Mesh를 그.. kyuhwang.tistory.com - Vertex Texture Fetch Skinni..
[DirectX 11] Rim Lighting
·
Graphics
Rim Lighting - 프로젝트 진행중 아트측 요청으로 배경과 캐릭터 간의 구분을 위해 Rim Lighting을 추가해달라는 요청이 있어서 추가하게 되었다. - 적용을하다 보니 구분을 위해 사용함과 동시에 Noise Texture를 혼합하여 피격 효과나 프로젝트에서 보스의 분신을 생성할때 사용하면 나쁘지 않겠다는 생각이 들었다. - 일단 Rim Light란 Lembert 공식에서 ( N dot L )에서 Light Vector 대신 View Vector를 활용하여 1-( N dot V )로 값을 뒤집어 외곽선을 뚜렷하게 보이게 하는 효과이다. - 결국 Rim Light는 역광에서 나온 빛이 반사되어 보인다고 생각하면 될 것 같다. - 해당 Rim Light를 자유롭게 쓰기 위해 너비값, 강도, 색상을..
[DirectX 11] Vertex Texture Fetch Skinning Animation Instancing
·
Graphics
Vertex Texture Fetch Skinning Animation Instancing - 현재까지 사용했던 Constant Buffer를 활용한 Skinning Animation은 한계점이 많았다. Constant Buffer를 통한 Skinning이 아닌 Texture Buffer를 활용하여 Skinning Animation을 Vertex Shader 측에서 Sampling 하여 적용하는 방식이다. Constant Buffer Skinning Animation 단점 - Constant Buffer는 미리 크기를 지정해두어야 한다는 단점이 있다. - Instancing을 하기 위해선 각각의 Object의 Animation Data를 담을 공간이 필요한데 모든 Object의 Animation Data..
[DirectX 11] Hierarchical Z-Buffer Occlusion Culling
·
Graphics
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)
·
Graphics
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 관리 방식
·
Graphics
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 전달 방식
·
Graphics
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을..