DirectX 11
[DirectX 11] Dissolve Effect
Dissolve Effect - 특정 모델이 죽거나 사라질때 갑자기 사라지는 것이 너무 어색하다 느껴, 이전에서 부터 이러한 효과들을 추가해보고 싶은 욕심이 있었기에 객체가 타들어가는 효과인 Dissolve Effect를 활용하게 되었다. Dissolve Effect 적용 방식 - 일단 Dissolve Effect를 적용하기 위해선 Dissolve 전용 Noise Texture가 필요로한데 시간적인 부분도 있고 아트측에서 제작해본 경험도 없었기에 아트측에서 제작한 몇개의 Texture와 구글링을 통해 찾은 Texture를 섞어 사용하게 되었다. - 실체가 보여지는 굵기와, 타들어가는 속도, 타들어가는 색상 및 강도, 타들어가는 부분의 바깥쪽과 안쪽의 강도를 설정 할수 있게 구현하여 세세한 조절을 할 수 ..
[DirectX 11] Color Grading & LookUpTable Texture
Color Grading - 후처리 방식중 하나이며, 전체적인 스크린상의 RGB값을 활용하여 미리 계산해둔 다른 테이블의 RGB로 변환시키는 작업이다. - 영화측에서는 거의 필수적으로 사용한다고 하며, 다른 테이블을 참조해서 변환한다는 것 자체는 간단하지만 생각보다 효과적인 결과물을 볼 수 있다. Color Grading을 적용하게된 계기 - 현재 진행중인 프로젝트에서 외부에 있을때와 내부에 있는 경우는 IBL을 영역별로 나누어 분위기를 조성하였지만, 게임 흐름상 보스존에 입장한다거나 공간에 대한 변화가 있을때 추가적인 효과를 주기 위해 추가하게 되었다. - 처음엔 단일 Color Grading을 적용하려고 생각하였으나 교수님이 피드백으로 보통 게임에서 상황이나 구역별로 영역을 지정하여 가중치를 주어 블..
[DirectX 11] HDRI Sky Light & Sky Cube Baking
HDRI Sky Light & Sky Cube Baking - 이전에는 SDR CubeMap을 활용하여 IBL을 적용하였는데, Shadow 영역이 부자연스럽다는 피드백을 받아 HDRI를 활용함과 동시에 배치되어있는 Directional Light의 방향과 일치시킨 CubeMap을 Baking 하는 기능을 추가하여 자연스럽게 하도록 하였다. 이전 IBL 방식의 문제점 - HDR Image를 활용하지 않아 태양의 강도를 표현하기 어렵다. - IBL에 적용된 Image가 전체적으로 너무 밝은 이미지여서 제대로된 IBL 효과를 볼 수가 없었다. - IBL에 적용된 Image의 Light 방향과 게임상에 적용되있는 Directional Light의 방향이 다르기에 Shadow 영역이 의도치 않게 밝게 나오는 현상..
[DirectX 11] Material Property Block
Material Property Block - 현재 같은 Mesh를 사용하는경우 Instancing을 통해 같은 Batch로 모아서 그리는 과정에서 특정 한 객체의 Material만 변경해야 할 경우를 처리하기 위해 Material Property Block을 도입하게 되었다. Material Property Block 동작 원리 - 현재 배치되어있는 Instance Batch는 유지하되, 현재 Material Property Block이 활성화된 시점 동안에만 잠시 다른 Batch로 빼서 따로 그리는 방식이다. - 현재 Instance Batch를 실시간으로 변경해주는 것보다 활성화된 시점에만 잠시 빼서 따로 그리는 방식이 효율적이라 생각이 들어 해당 방식으로 적용하였다. - 해당 객체의 Materia..
[DirectX 11] Rim Lighting
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
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
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를 통해..