전체 글

전체 글

    [DirectX 11] Skinning Mesh

    [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

    [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..

    [DirectX 11] Gamma Correction

    [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

    [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

    [DirectX 11] Shadow Map

    Shadow Map 기존 오브젝트 Rendering을 하기 전 Pass에서 Camera 기준이 아닌 Directional Light 기준 View, Projection을 이용하여 투영해서 Depth를 찍어둔 후 바인딩된 ShaderResourceView를 참조하여 Lighting 연산. 위 그림에서 파란색 선이 현재 광원 기준에서 바라볼때 보이는 영역이다. 검은색 선으로 표시된 부분이 즉 광원기준에서 바라본 오브젝트가 투영된 Shadow 영역. 왼쪽 그림은 오브젝트 아래 표면에 그림자가 생기는 방향성 광원을 보여준다. 깊이 맵에 저장된 깊이 값을 사용하여 가장 가까운 지점을 찾고 이를 사용하여 현재 영역이 그림자 영역 안에 있는지 여부를 결정하고, 해당 광원에 특정한 보기 및 투영 행렬을 사용하여 깊이 ..

    [DirectX 11] Screen Space Ambient Occlusion

    [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..