Directx11
[DirectX 11] Gamma Correction
Gamma Correction - 일반적으로 Texture 데이터는 GammaEncode 되어서 저장되어 있으므로 Gamma Correction을 통해 Light 연산을 할 때에는 Linear Space로 변환을 하여 연산을 해주어야 GammaDecode 상태로 색상이 출력 될 수 있다. Gamma Encode 하는 이유 - 인간의 눈은 어두운 곳의 변화에 민감하고, 밝은 곳의 변화에는 둔감한 특징이 있다. 따라서 어두운 곳의 해상도를 높이고자 비선형 함수를 사용하여 데이터를 저장한다. Gamma Correction 방법 - 결과적으로 Gamma Encode된 Texture 데이터를 Linear Space로 변환. (pow(x, 2.2f)) - Linear Space에서 조명 연산과 Texture 혼합 ..
[DirectX 11] Deferred Rendering GBuffer
Deferred Rendering Rendering 방식 - Forward의 경우한개의 RenderTarget을 사용하여 각각의 오브젝트를 각각 라이트 연산을 하는 방식. - Deferred는 여러개의 RenderTarget을 사용하여 각각의 오브젝트를 해당 RenderTarget에 데이터를 저장해논 후 최종 라이트 연산을 한번에 하는 방식이 있다. Deferred의 이점 - 라이트의 개수가 많아질수록 이득이 크다. 예를들어 Forward Rendereing의 경우 라이트가 10개라고 생각할 경우 각각 오브젝트 마다 라이트연산을 n*10 만큼의 비용이 소모된다. 하지만 Deferred Rendering의 경우 화면크기의 RenderTarget들에 각각 필요 한 데이터 (Position, Normal, M..
[DirectX 11] Shadow Map
Shadow Map 기존 오브젝트 Rendering을 하기 전 Pass에서 Camera 기준이 아닌 Directional Light 기준 View, Projection을 이용하여 투영해서 Depth를 찍어둔 후 바인딩된 ShaderResourceView를 참조하여 Lighting 연산. 위 그림에서 파란색 선이 현재 광원 기준에서 바라볼때 보이는 영역이다. 검은색 선으로 표시된 부분이 즉 광원기준에서 바라본 오브젝트가 투영된 Shadow 영역. 왼쪽 그림은 오브젝트 아래 표면에 그림자가 생기는 방향성 광원을 보여준다. 깊이 맵에 저장된 깊이 값을 사용하여 가장 가까운 지점을 찾고 이를 사용하여 현재 영역이 그림자 영역 안에 있는지 여부를 결정하고, 해당 광원에 특정한 보기 및 투영 행렬을 사용하여 깊이 ..
[DirectX 11] Screen Space Ambient Occlusion
SSAO Screen Space에서 화면에 보이는 오브젝트만 Ambient Occlusion을 통해 특정 점을 기준으로 구를 그려 한번씩 체크하여 다른 점을 발견하면 그 점에 대해 차폐됬다고 판단하여 어둡게 처리하는 방식. Camera View 공간에서 Depth 값과 Normal 값을 이용하여 처리. // SSAO Pass전 Depth Buffer 생성.. vout.Depth = float4(normalV, pin.PosV.z); float4 SSAO_PS(VertexIn pin) : SV_Target { float4 normalDepth = gDepthMap.SampleLevel(gSamBorderLinearPoint, pin.Tex, 0.0f); // View Space Normal float3 n..