graphics 16

[Noise] Fractal Brownian Motion - Perlin Noise

자연현상을 묘사하기 위해, 우리는 펄린노이즈라는 노이즈를 사용합니다. 그냥 랜덤함수만 사용하면 너무 규칙적이기 때문에 자연현상과 너무 다르기 때문이죠. 이번에는 들판의 잔디같은 것들을 컴퓨터 그래픽스에서 어떻게 움직일 수 있는지에 대해 이해해보겠습니다. 잔디는 파동 형태로 흔들리게 할 수도 있죠. 파동의 중요한 특성은 두가지가 있는데 진폭과 주파수입니다float amplitude = 1.;float frequency = 1.;y = amplitude * sin(x * frequency); 좀 더 이것저것 합친 파형을 만들기 위해선 파동을 합칠 수 있습니다. 물리학 시간에 배웠을 수도 있는데요. 이를 superposition(중첩)이라고 합니다. 파동들을 더하면 다음과 같은 모양이 될 수도 있습니다. f..

[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

[유체역학] Curl-Noise와 비압축성 유체(incompressible fluids)

우리가 유체를 표현할 때 앞에서 Projection을 통해서 유체의 흐름을 나타냈습니다. Projection을 다시 정리하자면,Divergence를 계산하고, 그 Divergence로 jacobi iteration을 돌려 압력값을 계산하고, 그 압력으로 속도를 계산하였습니다. 하지만 Curl-Noise 방식은 ∇·∇× = 0 즉, curl연산(회전미분, 회전 정도 계산)을 한 후 Divergence를 하면 반드시 0이 된다는 원리를 이용해 비 압축성 유체를 표현합니다. 본격적으로 Curl-Noise방식을 이해하기전에 Curl과 Divergence의 개념에 대해서 다시 이해해봅시다. 1. Curl은 회전미분 즉,회전 정도를 뜻합니다. 어떤 점에서 벡터장이 얼마나 회전하려는 경향이 있는지를 알아내는 계산입니..

[유체 역학] Navier-Stokes equation과 volticity적용

유체 시뮬레이션을 적용하기 위해서는 크게 Sourcing => Diffuse => Projection => Advection로 진행할 수 있습니다.이를 이해하기 위해서는 Chorin's Projection Method와 Volticity(소용돌이)를 이해해야합니다. Navier-Stokes equation은 비압축성 유체의 운동을 기술하는 편미분 방정식(PDE) 으로, 아래와 같은 비압축성(ρ=constant) 형태가 일반적으로 사용됩니다. 하지만 속도와 압력이 강하게 결합되어 있어 풀기가 어렵습니다. 따라서 Chorin의 Projection Method가 이 문제를 해결해줍니다. Chorin Projection Method는 크게 보면 두가지로 나뉘어져 있습니다.  1)2) 1)첫번째 단계는 중간속도를..

[유체역학] (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되는 방식을 구현하는 과정인데, ..

[Gradient] 스칼라 값을 벡터로 편미분하기

SPH논문을 구현하는 중에 그레디언트 개념 정립이 필요할 것 같아서 정리를 해보려고 합니다. W=f(q)입니다. q는 위치 pi - 위치 pj로  x,y,z로 이루어져 있습니다. 우리가 원하는 것은 ∇W입니다. 즉 x,y,z로 편미분 한 값이죠. W는 q로 이루어져있어서, x,y,z로 바로 편미분 할 수 없으니 q와 x,y,z를 통해 계산합니다. 수식 정리 하기 전에 Gradient개념을 설명해드리려고 합니다. 스칼라 값을 벡터로 미분하기 위해서는 정미분으론 안되고 편미분을 해야합니다. 예를들어 V= x^2 * y * z^3이 있다면 V를 x,y,z로 각각 편미분 하면∇V = (2x*y*z^3, x^2 * z^3 , x^2 * y * 3 * z^2)입니다. 표현은 ∇V=(∂V/​ ∂x, ∂V/​ ∂y ​..

[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