Graphics Techniques 32

[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

[유체 시뮬레이션] 3d연기 Down=> Up Sampling으로 성능향상 기법

3d연기를 계산할 때, 여러 쉐이더를 거쳐서 계산이 되는데, Projection부분을 Down sampling하고 그 후 upSampling해서 해상도를 조절하여 속도를 향상시키고 결과는 Up해상도에서 진행된 것처럼 보이게 할 수 있습니다. 순서는 Volticity =>DownSampling=> sourcing => Projection => UpSampling => Advection 순서입니다. DownSampling상태에서 Sourcing과 Projection단계를 진행하고 그 차이만큼 UpSampling에 다시 갱신해주는 방식입니다. 이 그림을 보고 강의 예제 코드를 다시 살펴보면 이해하기 수월할 것입니다. 강의 출처 : 홍정모 그래픽스 새싹코스 Part4 (3d연기 시뮬레이션 2/2)https://..

Graphics Techniques 2025.03.06

[Volume Rendering] 구름 볼륨 렌더링 + SDF

구름 볼륨 렌더링을 할 때, 3가지 방식을 진행합니다. CloudDensity-> CoudLighting-> Scattering이죠. 우리가 흔히 무엇을 그리는 과정은 2d texture에다가 했습니다. 하지만 3d texture에다 노이즈를 생성하여 형성하는 방법이죠. 1) CloudDensitydensity의 방법을 살펴보겠습니다. density란 밀도라는 뜻입니다. 노이즈를 형성하여 3d텍스춰에 노이즈를 형성합니다. perlinWorley방식을 사용하여 노이즈를 생성하였습니다. (참고링크 https://www.shadertoy.com/view/3dVXDc) 구름의 움직임을 표현하기 위해서 [numthreads(16, 16, 4)]void main(uint3 dtID : SV_DispatchThrea..

Graphics Techniques 2025.03.01

[Compute Shader] Bitonic-sort

바이토닉 정렬은 잘 쓰이는 알고리즘은 아니지만, 병렬처리로 구현할 수 있다는 부분에서 다른 정렬과는 차이가 있습니다. 퀵정렬같이 시간복잡도는 O(N*logN)입니다. 하지만 컴퓨터 쉐이더에서 병렬로 처리할 수 있다면 더 빠르겠죠?코드는 다음과 같습니다. for (uint32_t k = 2; k 0; j /= 2) { #pragma omp parallel for for (int32_t i = 0; i i) { if (((i & k) == 0) && (arr[i].key > arr[l].key) || ((i & k) != 0) && (arr[i].key  그런데 왜 병렬처리를 할 수 있냐면, for (i..

Graphics Techniques 2025.02.16

[ComputeShader] 컴퓨팅 쉐이더 픽셀 깨짐

컴퓨팅 쉐이더로 계산할 때 픽셀에 노이즈가 끼는 현상이 발생할 수 있습니다. 일반적인 그래픽스 파이프라인을 거치면 한 픽셀에 정확히 어떤 값을 계산해서 넣을지가 결정이 되지만, 컴퓨팅 쉐이더는 스레드단위로 픽셀을 계산하기 때문에 어떤 값이 들어갈지 모르기 때문입니다. 예를들어 그래픽스 디버거로 확인해 봤을 때, 다음과 같은 깨짐 현상이 발생합니다.실제로 이렇게 가만히 있는게 아니라 정확히 덮히기도 하고 다시 깨지기도 하는 현상이 발생합니다. 이를 해결하기 위해선 고급 자료구조를 사용할 필요가 있습니다. 아니면 일반적인 그래픽스 파이프라인을 거치고 blendset을 설정하여 해결할 수 있습니다

Graphics Techniques 2025.02.15

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

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

Graphics Techniques 2025.01.29

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

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

Graphics Techniques 2025.01.21

[PBR] HDRI - postprocess

우리가 후처리를 할 때 예를들어 가우시안 블러를 적용할 때, LDR(Low Dynamic Range)이미지(unorm)이미지로 적용을 하였습니다. 하지만, HDR(High Dynamic Range)이미지를 적용할 때는 방법이 다릅니다. 더 사실적으로 표현하기 위함이죠. HDR이미지는 unorm(R8G8B8A8)과 다르게 float16(R16G16B16A16)입니다. 더 넓은 범위의 빛의 강도를 조절할 수 있지요. 가우시안 블러를 적용하려면 다음과 같은 단계를 따릅니다. 1. 해상도 줄이기(빛 번짐 표현 하기 위함. 이거 없으면 가우시안 블러를 많이 적용해야돼서 속도에 영향을 미침)=> Down 샘플링과 Up샘플링으로 표현2. 가우시안 블러(주위 값을 Convolusion을리가 후처리를 할 때 예를들어 가..

Graphics Techniques 2025.01.15