DirectX 11
[DirectX 11] PBR (Physically Based Rendering)
Physically Based Rendering BRDF ( Bidirectional Reflectance Distribution Function ) - "양방향 반사율 분포 함수" 라고 하며, Diffuse BRDF와 Specular BRDF로 나뉜다. - BRDF의 조건 1) 반사율 분포를 출력으로 내뱉는다. 2) 양방향성을 가진다. 광원과 관찰자의 관계가 동일하다면 반사율 분포가 변하지 않는다. 3) 광원과 관찰자를 입력 파라미터로 받는다. 4) 같은 입력에는 항상 하나의 같은 결과가 나와야한다. - BRDF의 모델 1) Cook-Torrance 2) Oren-Nayar 3) Phong 4) Blinn Diffuse BRDF - 광원이 어떻게 반사할지는 물체의 성분과 밀도에 따라 달라지기 때문에 한..
[DirectX 11] Deferred Rendering FXAA
Deferred Rendering MSAA - 기존 Forward Rendering에선 문제없이 사용하였던 MSAA를 Deferred Rendering에선 여러개의 RenderTarget에 Anti-Aliasing 처리를 하면 안되기 때문에 다른 방식으로 처리를 해야한다. Deferred Rendering Anti-Aliasing 방법 1) SV_Coverage 방식 - Fragment에 의해 다루어진 픽셀을 계산하는 SV_Coverage 사용 방식이다. - Coverage Mask가 1111이 아닌 하나의 픽셀 샘플이 있다면 다른값을 반환하여, 이 복잡성을 Multi Sampling 된 Buffer에 저장해둔 후, 최종 픽셀 출력시 인접 픽셀과 평균을 내어 계산한다. - 화면 공간의 비연속성 보다는 기..
[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들도 같이 움직이게 된다. ..