Directx11
[Project] DirectX 11 3D Mini Project
DirectX 11 3D Project ( Blade Dancer ) Component 기반 DirectX 11 3D 프로젝트 플레이 영상입니다. Graphic 적용기술 Normal Mapping Shadow Mapping Skinning Animation SSAO Deferred Rendering 실행 파일 BladeDancer.zip drive.google.com
[DirectX 11] Order Independent Transparency
CPU Sorting Transparency - DirectX 11의 Blend State를 이용해 Output Merge에 바인딩을 하여 Blending을 일반적인 Alpha Blending 할 경우를 생각해보면 가려지는 부분은 그릴 필요가 없기 때문에 Pixel에 그리기 전 깊이에 따른 정렬을 해주어야 한다. Order Independent Transparency - 오브젝트 단위로 투명도 렌더링을 할 경우 정확한 투명도의 선후관계를 처리하기 힘들다. - 결국 정확한 선후관계를 판별하기엔 픽셀 단위로 해야하는데 위의 문제를 보안하기 위해 쉐이더 내부에서 처리하는 OIT 기술을 적용하게 되었다. - 반투명 오브젝트는 렌더링 하기전 미리 분류한 후 다른 방식의 렌더링 방식으로 처리한다. - 오브젝트를 해..
[DirectX 11] Particle System
Particle System - Unity Particle System을 참고하여 현재 프로젝트에서 필요한 기능 위주로 제작. - 현재 MaxParticle 개수대로 만들어 두고 파티클을 사용하고 있다. - LifeTime Option에 따른 Animation 분기 설정 후 애니메이션 실행. // Particle Animation Option typedef enum PARTICLE_ANIMATION_OPTION : UINT { TEXTURE_ANI= 0x00000001, COLOR_ANI= 0x00000010, POSITION_ANI= 0x00000100, ROTATION_ANI= 0x00001000, SCALE_ANI= 0x00010000 }PARTICLE_ANIMATION_OPTION; // Part..
[DirectX 11] Terrain Mesh Blending
Terrain Mesh Blending - 현재 프로젝트 진행중 Unreal Data를 이용하여 Terrian Material Layer 들의 Mask Image와 각각의 Material Texture을 이용하여 Texture Blending을 한다. - 현재 프로젝트에서 사용하고있는 Terrian Layer는 두개를 사용하기에 R, G Channel 만 이용. Texture Blending - 위의 이미지는 100 x 100 단위로 1 Pixel에 해당 Material 가중치가 들어있는데, 위 데이터를 활용하여 Terrain의 Blending을 할 수 있다. - Terrain의 경우 일반 Mesh 와는 다르게 Vertex Buffer에 해당 Vertex의 Mask Color를 입력해두어 내부 Pixel..
[DirectX 11] Map / UnMap vs UpdataSubresource
UpdataSubresource - 매 프레임 1번 미만으로 일어나는 Resource Update에 적절하다. - 해당 Buffer의 크기와 같은 Data를 받아 내부적으로 Resource Data를 Map / UnMap 하여 Resource Copy 한다. - 하나의 Resource에 Thread를 이용하여 동시에 복사는 불가능. (내부에서 Lock / Unlock 하기 때문) - CPU에서 GPU로 데이터를 복사하는 방식. Map / UnMap - 매 프레임 1번 이상으로 일어나는 Resource Update에 적절하다. - 해당 Buffer를 Map을 통해 Unlock 하여 변경하고 싶은 Resource Data를 memcpy 하고, UnMap하여 Buffer를 Lock 해주어야 한다. - GPU에..
[DirectX 11] Animation
Animation Animation Data는 KeyFrame 기준 Data로 Sampling 되어 저장된다. 일단 KeyFrame 그대로 Local Matrix를 반영하여 출력하면 애니메이션이 나오긴 할텐데, 매우 끊겨보일 것이다. 그러므로 우리는 Sampling 된 KeyFrame Data 간의 추가적인 보간 작업을 해주어야 하는데, Scale, Position은 Lerp(선형보간)을 통해 KeyFrame 간의 보간을 해주면 된다. 하지만 Rotation은 Slerp(구면선형보간)을 통해 KeyFrame 간의 보간을 해주어야 한다. Rotation의 경우 Format 마다 저장되는 방식이 다를 수 있다. float _time = 0; float _angle = 0; Vector3 _rot = Vect..
[DirectX 11] Skinning Mesh
Skinning Mesh 이전 Static Mesh는 Vertex로 이루어진 Face를 이어 붙여 해당 Object의 World Matrix를 곱하여 출력을 하지만 Skinning Mesh는 조금 많이 다르다. 일단 Skinning Mesh의 Vertex는 영향을 받는 Bone의 가중치를 알고 있고 해당 가중치가 있는 Bone들의 World Matrix를 누적한 것과 Bone 기준 Vertex의 Offset Matrix를 연산하여 해당 Vertex의 World 값을 구한다. Offset Matrix란 해당 Bone 기준 Vertex가 얼마나 떨어져 있는지 나타내는 Matrix이다. 이와 같이 가중치에 따라 연산을 하게 되면 Bone이 움직이면 Bone에 영향을 받는 Vertex들도 같이 움직이게 된다. ..
[DirectX 11] Normal Mapping
Normal Mapping Normal Map을 이용한 접선 공간에서의 수직 축인 Normal을 추출하여 Light 연산을 하는 방식이다. 기존 World 기준 Normal값을 이용하여 Tangent를 추출해야하는데, 삼각형을 이루는 점 3개를 통해 Tangent를 유도한다. Binormal의 경우 Normal값과 Tangent값만 있다면 외적을 통해 구할 수 있으므로 공간 절약을 위해 Shader 측에서 하기로 한다. 위 이미지에서 오브젝트 또는 World Space Normal Mapping(왼쪽), Tangent Space Normal Mapping(오른쪽)을 통해 왼쪽의 World 기준 축을 잡게 되면 좀더 세밀한 Light연산이 불가능하다. 오른쪽 이미지처럼 정점 기준 표면의 축을 기준으로 No..