DirectX 14

[Physically Based Rendering] IBL과 Directional Light 구분

PBR [Physically Based Rendering]은 두 가지 방식으로 조명을 사용합니다. 1) Directional, Point, Spot같은 직접 조명2) IBL[Image Based Rendering], 주변 환경맵을 통한 조명 둘의 공통점과 차이점을 이해하기 위해 다음 식을 살펴봅시다. 일단 첫번째로 조명은 Diffuse와 Specular부분으로 나뉩니다. 직접 조명도 그렇고 IBL도 그렇죠kd*c / 𝝅는 DIffuse부분입니다. 그 뒤 DFG/4( ω 0 ㆍ n * ω i ㆍ n )는 Specular부분입니다. 식을 Cook Torrance Model이라고 하죠. pbr적용시 에너지 보존법칙이 성립해야 하는데 kd+ks=1 이어야 한다는 점입니다. Cook Torrance Mod..

Graphics Techniques 2025.04.14

[Tone Mapping] Gamma correction과 CRT

HDR이미지는 밝기를 0.0~1.0으로만 표현하면 다양한 빛의 밝기를 표현하지 못합니다. 따라서 16float형식이나 32float형식을 사용합니다. 16float의 범위는 약 0.0~65504.0입니다. 보통 skybox같은 이미지에 태양이 있기 때문에 skybox를 16float으로 설정합니다. LDR이미지는 모니터에 표현되는 값을 위해 0.0~1.0의 값으로 정규화 되어있습니다. 그렇다면 HDR이미지를 잘 계산한 후 LDR이미지로 변환해주는 것이 필요하겠죠? 이 과정을 톤 매핑이라고 합니다. Unity에서는 톤매핑의 정의를 다음과 같이 표현하기도 합니다."톤 매핑(Tonemapping) 은 일반적으로 컬러 값을 HDR에서 LDR (low dynamic range)로 매핑하는 과정입니다. 이는 대부분..

Graphics Techniques 2025.04.09

[Animation] 캐릭터 애니메이션의 원리

캐릭터를 형성할 때는 bone(뼈)와 mesh들로 이루어져 있습니다. 다음 그림과 같은데요뼈들을 보면 관절을 중심으로 모두 연결되어 있는 것을 볼 수있습니다. 뼈들은 트리구조로 이루어져 있으며 보통 골반이 루트노드가 됩니다.  애니메이션을 그리는 순서는 다음과 같습니다. 1) FindDeformingBones => 모든 메쉬에 대해서 버텍스에 영향을 주는 뼈들의 목록을 만든다.2) UpdateBoneIDs => 트리 구조를 따라 업데이트 순서대로 뼈들의 인덱스를 결정한다3) ProcessNode => 메쉬의 vertex들을 어떤뼈에 얼만큼 영향 받는지 meshData에 넣어줌 4) ReadAnimation => 뼈 수랑 인덱스 부여됐으니 그걸 이용해서 애니메이션 데이터 넣음 => AnimationClip..

Graphics Techniques 2025.03.20

[유체역학] (Navier-Stokes)Implicit equation의 안정성

explicit equation이란 y = x^2+x같이 y가 x에 의해 딱 정의된 것이고, implicit equation은 x^2+2xy+y^2=0과 같이 x와 y는 독립적으로 딱 구분할 수 없고 x와 y로 같이 정의되는 함수를 말합니다. Navier-Stokes방정식에서 왜 implicit integeration을 적용해야 안정성이 높은지 말씀드리겠습니다. 다음 식은 Navier-Stokes방정식에서 유체가 천천히 번지는 경우(Diffuse)를 계산하는 식입니다.explicit integration은 n번째 u와 n+1번째 u를 구분하였습니다. 따라서 viscosity가 매우 클 경우, 갑자기 수치적으로 발산할 가능성이 커집니다. 이 식은 유체가 천천히 diffuse되는 방식을 구현하는 과정인데, ..

[shadowMapping] PCSS - 부드러운 그림자

PCSS기법이란 부드러운 그림자 기법 PCF를 활용하여 더 사실적인 그림자를 묘사하는 기법입니다. light의 너비를 고려하여 빛이 통과되는 부분도 있고 아닌부분도 있는 부분 즉 penumbra를 고려하여 그립니다. - PCF기법PCSS기법을 이용하기전에 PCF를 이해해야 하는데요, 레스터라이제이션에서는 raytracing으로 그림자를 처리하지 않고,light의 카메라로 생각하고 얻은 depth값들을 shadowMap에 저장합니다. 그리고 원래 스크린에 해당하는 픽셀의 posWorld값에서 다시 light으로 투영변환을 거칩니다.(이 때, light를 카메라로 생각하고 투영변환한 투영행렬을 이용합니다) 그렇게 그 값들과 shadowMap을 비교해서 그림자를 판단합니다. 여기서 주위 픽셀 값들을 blend..

Graphics Techniques 2025.01.29

[homogeneous divide] NDC->월드좌표계, 월드좌표계 -> NDC

Perspective projection에서는 homogemeous divide가 필요합니다. 일반적인 공간변환과 다르게 투영 행렬이기 때문이고, NDC좌표계로의 변환이 필요하기 때문입니다. 일반적으로 directX의 hlsl에서는 뷰or월드 좌표계를 proj행렬을 곱하면, 클립좌표계(NDC아님)로 변환이 됩니다. 이 과정은 버텍스 쉐이더에서 이루어지고, 이 값을 픽셀 쉐이더로 넘겨줬을때 알아서 NDC좌표계로 그래픽스 파이프라인 내부적으로 변환이 됩니다. 다음 그림을 이해해 봅시다.주의할 점은 vertex shader에서 proj를 한 결과가 2차원이 아닌 3차원인 clip space라는 것입니다. 여기서 z값은 추후 깊이버퍼로 뒤 물체가 가리는지 아닌지를 판단할 때 쓰입니다. 코드는 다음과 같습니다. ..

[DepthStencil] 거울 반사의 원리와 구현

Rasterization에서 거울 반사를 하려면 당장 떠오르는 방법은 RayTracing을 사용하는 것입니다. 생각해보면, 일반 물체를 그리고, 거울을 그린다음에 시점에서 거울로 ray를 쏘고 그 값들을 모두 gpu 즉, 쉐이더에 넣어서 계산하는 방법이 있습니다. 하지만, 복잡한 최적화 알고리즘이 필요하고 또한 느리기 때문에 보통 게임엔진에서는 사용하지 않습니다. 그렇다면, 어떤 방법이 있을까요? stencil을 이용하는 방법이 있습니다. stencil이란 쉽게 설명해서 종이에서 그리고 싶은 부분만 뚫어놓고 그 종이를 나무에 대고 스프레이를 뿌리는 방식을 생각하면 됩니다. 즉 뚫린 부분만 1로 비트마스킹하고 나머지는 0으로 만드는 개념이죠. 거울 반사의 원리 순서는 다음과 같습니다.1. 거울이 없다고 생..

Graphics Techniques 2025.01.21

[Tessellation] quad tesselation순서 및 patch control point 계산

Quad 그리는 코드는 다음과 같습니다.context->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST); 텍스춰 좌표로 따졌을 때, (0,0) -> (1,0) - > (0,1) -> (1,1) CW(시계방향)이라도 이렇게 하지 않으면 왜곡이 생길 수 있습니다. 그리고 그릴 때 draw로 해도되고, drawIndexed로 해도 됩니다. index개수와 순서가 잘 맞기만 한다면요. 예를들어 사각형 3개를 가로로 나란히 그릴 때 vertex 8개, index 12개가 필요합니다. drawIndexed로 그려도 각 패치에 vertex들이 patch control point로서 잘 들어갑니다. 또한 Hull shader에서 테셀레..

Graphics Techniques 2025.01.06

[Staging기법] Gpu텍스춰를 Cpu로 가져오기 (마우스피킹)

Direct3d와 게임 엔진 등 대부분 RayTracing이 아니라, Rasterization방식을 이용합니다. 여기서 물체를 클릭하고 싶을 때, 어떻게 할까요? 방법은 두 가지가 있습니다.1. 월드좌표계의 물체에 eye에서 마우스 위치 방향으로 ray를 쏘기.2. 스크린 좌표계에 투영된 물체를 이용하여 클릭된 물체 찾기 첫번째 방식은 ray를 쏘는 방식입니다. RayTracing방식이나 Rasterization방식이나 많이 이용합니다. 하지만 Gpu 자료를 Cpu로 가져오는 연습을 하기위해 두번째 방식을 공부해봅시다. 두번째 방식을 좀 더 자세히 알아보겠습니다.순서는 다음과 같습니다.1) 각 물체마다 index를 정하고 물체마다 고유 색깔을 지정합니다.2) 렌더 타겟을 두개 준비합니다.    첫번째 렌..

Graphics Techniques 2024.12.23

[렌더링파이프라인] 구 Mapping의 원리

구를 그릴 때, 실린더를 그리고 위 아래의 vertex를 붙이는 방법으로 그리는 법과, 정n면체를 그리고 subdivision을 통해 구를 그리는 방법이 있습니다. 실린더의 방법으로 그리고 subdivision을 하면 wireframe으로 봤을 때 삼각형의 크기가 균일하지 않습니다. 실린더의 삼각형들의 크기가 애초에 다 다른데, 그 상태에서 subdivision을 하기 때문입니다.  하지만 정n면체는 각 삼각형의 크기가 모두 같기 때문에 삼각형의 크기가 균일하다는 장점이 있습니다. 하지만, 텍스춰링을 할 때 마지막 끝 vertex가 두개가 아니라 하나이기 때문에, 잘리는 현상이 발생합니다. 왜냐하면 마지막 끝 점을 두개로 나누지 않으면 마지막 삼각형에서 interpolation을 0~0.9..사이의 값을..

Graphics Techniques 2024.12.05