🕹️자체엔진/입문

[번역강좌] 1. 이론 - 물리 기반 렌더링(Physically Based Rendering)

Mawile 2022. 9. 30.
728x90

이론

PBR(Physical based rendering)은 물리적 세계와 거의 일치하는 동일한 기본 이론을 기반으로 하는 렌더링 기술의 집합이다. 물리적 기반 렌더링은 물리적으로 그럴듯한 방식으로 빛을 모방하는 것을 목표로 하기 때문에 일반적으로 퐁 및 블린-퐁과 같은 원래 조명 알고리듬에 비해 더 현실적으로 보입니다. 실제 물리학에 근접하기 때문에 더 좋아 보일 뿐만 아니라, 우리(특히 예술가)는 조명을 올바르게 보이게 하기 위해 값싼 해킹과 조정에 의존하지 않고도 물리적 매개변수에 기반한 표면 재료를 작성할 수 있습니다. 물리적 매개 변수를 기반으로 재료를 제작하는 데 있어 더 큰 장점 중 하나는 이러한 재료가 조명 조건에 관계없이 올바르게 보인다는 것입니다. 이건 PBR 파이프라인에서는 사실이 아닙니다.

그럼에도 불구하고 물리적 기반 렌더링은 (물리학적 원리에 기초한) 현실의 근사치이다. PBR 조명 모델이 물리적으로 고려되려면 다음 세 가지 조건을 만족해야 합니다.

1. 미시적 표면 모델을 기반으로 합니다.
2. 에너지를 보존합니다.
3. 물리적 기반 BRDF를 사용합니다.

다음 PBR 챕터에서는 디즈니가 원래 탐색하고 에픽게임즈가 실시간 디스플레이를 위해 채택한 PBR 접근 방식에 초점을 맞출 것입니다. 금속 작업 흐름을 기반으로 한 그들의 접근 방식은 적절하게 문서화되었으며, 가장 인기 있는 엔진에 널리 채택되었으며 시각적으로 놀랍다. 이 챕터들이 끝날 때쯤에는 다음과 같은 것이 나올 것입니다.

 

이 장의 주제는 다소 고급스러우므로 OpenGL과 셰이더 조명에 대해 잘 이해하는 것이 좋습니다. 이 시리즈에 필요한 고급 지식으로는 프레임 버퍼, 큐브 맵, 감마 보정, HDR 및 노말 매핑이 있습니다. 우리는 또한 몇 가지 고급 수학에 대해 탐구할 것이지만, 저는 가능한 한 개념을 명확하게 설명하기 위해 최선을 다할 것입니다.


미시적 모델

모든 PBR 기술은 미시적 이론에 기초한다. 이 이론은 미시적 규모의 어떤 표면도 미시적 측면(microfacet)이라고 불리는 아주 작고 완벽하게 반사되는 거울로 묘사될 수 있다고 설명한다. 표면의 거칠기에 따라 이 작은 거울의 정렬은 상당히 다를 수 있다.

표면이 거칠수록 각 미세 표면은 표면을 따라 더 혼란스럽게 정렬됩니다. 이러한 작은 거울 정렬의 효과는 특히 스펙트럼 조명/반사에 대해 말할 때 들어오는 광선이 거친 표면에서 완전히 다른 방향으로 산란되어 더 광범위한 스펙트럼 반사가 발생할 가능성이 높다는 것이다. 대조적으로, 매끄러운 표면에서는 광선이 거의 같은 방향으로 반사되어 더 작고 날카로운 반사를 제공한다.

미시적 수준에서 완전히 매끄러운 표면은 없지만, 이러한 미세 면이 픽셀 단위로 구별할 수 없을 정도로 작기 때문에 거칠기 매개 변수가 주어지면 표면의 미세 표면 거칠기를 통계적으로 근사한다. 표면의 거칠기를 기반으로, 우리는 대략적으로 벡터 h에 정렬된 미세 면의 비율을 계산할 수 있다. 이 벡터 h는 라이트 랜드와 뷰 v 벡터의 중간에 위치하는 중간 벡터이다. 우리는 앞서 l과 v의 합을 그 길이로 나눈 고급 조명 장에서 중간 벡터에 대해 논의했습니다.

미시표면이 중간 벡터에 더 많이 정렬될수록, 반사경도 더 선명하고 강해진다. 0과 1 사이에서 변화하는 거칠기 매개변수와 함께, 우리는 통계적으로 미세표면의 정렬을 근사할 수 있다.

 

우리는 더 높은 거칠기 값이 부드러운 표면의 더 작고 날카로운 반사 형태와 대조적으로 훨씬 더 큰 반사 형태를 나타낸다는 것을 알 수 있다.

 

에너지 보존

마이크로페이스 근사치는 에너지 보존의 형태를 사용한다: 나가는 빛 에너지는 들어오는 빛 에너지(방출 표면 제외)를 초과해서는 안 된다. 위의 이미지를 보면 반사경 영역이 증가하지만 거칠기 수준이 증가할수록 밝기가 감소합니다. 만약 각 픽셀에서 스펙트럼 강도가 같다면(스펙트럼 모양의 크기에 관계없이) 거친 표면은 훨씬 더 많은 에너지를 방출하여 에너지 보존 원리를 위반할 것이다. 이것이 우리가 부드러운 표면에서는 반사경 반사를 더 강렬하게, 거친 표면에서는 더 희미하게 보는 이유이다.

에너지 보존이 유지되려면, 우리는 확산광과 분광광을 명확하게 구별할 필요가 있다. 광선은 표면에 부딪히는 순간 굴절부와 반사부 양쪽에서 갈라진다. 반사 부분은 직접 반사되어 표면에 들어오지 않는 빛입니다. 이것이 우리가 알고 있는 스펙트럼 조명입니다. 굴절 부분은 표면으로 들어가서 흡수되는 남은 빛입니다. 이것이 우리가 아는 확산 조명입니다.

굴절된 빛이 표면에 닿아도 바로 흡수되지 않기 때문에 여기에 약간의 뉘앙스가 있다. 물리학을 통해, 우리는 빛이 모든 에너지를 잃을 때까지 계속 앞으로 나아가는 에너지 빔으로 모델링될 수 있다는 것을 알고 있다. 각 물질은 다음 이미지와 같이 광선과 충돌할 수 있는 아주 작은 입자로 구성됩니다. 입자는 열로 변환되는 각각의 충돌에서 빛의 에너지의 일부 또는 전부를 흡수한다.

 

 

일반적으로 모든 에너지가 흡수되는 것은 아니며, 빛은 에너지가 고갈되거나 다시 표면을 떠날 때까지 다른 입자와 충돌하는 (대부분) 임의의 방향으로 계속 산란한다. 표면에서 다시 나오는 광선은 표면의 관찰된 (확산된) 색에 기여한다. 그러나 물리적 기반 렌더링에서, 우리는 모든 굴절된 빛이 아주 작은 충격 영역에서 흡수되고 산란된다고 가정하고, 멀리 떨어진 표면에서 빠져나올 산란된 빛의 영향을 무시한다. 이를 고려한 특정 셰이더 기법은 피부, 대리석 또는 왁스 같은 재료의 시각적 품질을 크게 향상시키는 지하 산란 기법으로 알려져 있지만, 성능에 대한 대가를 치르게 된다.

반사 및 굴절과 관련하여 추가적인 미묘함은 금속 표면입니다. 금속 표면은 비금속 표면(일명 유전체)과 비교하여 빛에 대해 다르게 반응한다. 금속 표면은 반사 및 굴절의 동일한 원리를 따르지만, 모든 굴절된 빛은 산란 없이 직접 흡수된다. 즉, 금속 표면은 반사된 빛 또는 스펙트럼 빛만 남습니다. 금속 표면은 확산된 색을 보이지 않습니다. 금속과 유전체 사이의 이러한 명백한 차이 때문에, 두 가지 모두 PBR 파이프라인에서 다르게 취급됩니다. 이 장에서 더 자세히 살펴보겠습니다.

반사광과 굴절광의 이러한 차이는 에너지 보존에 관한 또 다른 관찰을 우리에게 가져다 준다: 그것들은 상호 배타적이다. 빛 에너지가 반사되는 것은 더 이상 물질 자체에 의해 흡수되지 않을 것이다. 따라서, 굴절된 빛으로 표면으로 들어가기 위해 남겨진 에너지는 우리가 반사를 고려한 후에 직접적으로 발생하는 에너지입니다.

우리는 먼저 들어오는 빛의 에너지가 반사되는 비율에 해당하는 스펙트럼 분율을 계산하여 이 에너지 보존 관계를 보존한다. 굴절광의 분율은 다음과 같이 분광분수로부터 직접 계산된다.

 

float kS = calculateSpecularComponent(...); // reflection/specular fraction
float kD = 1.0 - kS;                        // refraction/diffuse  fraction

이 방법을 통해 에너지 보존 원칙을 준수하면서 들어오는 빛이 반사하는 양과 들어오는 빛이 굴절하는 양을 모두 알 수 있습니다. 이 접근 방식을 고려할 때 굴절/확산 및 반사/비경 기여도가 모두 1.0을 초과하는 것은 불가능하며, 따라서 이들의 에너지의 합이 들어오는 빛 에너지를 초과하지 않도록 보장한다. 이전 조명 장에서 고려하지 않은 내용입니다.

 

반사율 방정식

이것은 렌더 방정식이라고 불리기도 합니다. 매우 똑똑한 사람들이 생각해낸 정교한 방정식입니다. 그것은 현재 우리가 가지고 있는 빛의 시각적인 시뮬레이션을 위한 최고의 모델입니다. 물리적 기반 렌더링은 반사율 방정식으로 알려진 렌더 방정식의 보다 전문화된 버전을 강하게 따른다. PBR을 제대로 이해하려면 먼저 반사 방정식을 확실하게 이해하는 것이 중요합니다.

반사율 방정식은 처음에는 어려워 보이지만, 분해하면서 서서히 이해가 가는 것을 보게 될 것입니다. 그 방정식을 이해하기 위해서, 우리는 약간의 방사능 측정법을 연구해야 한다. 방사선 측정법은 가시광선을 포함한 전자기 복사를 측정하는 것이다. 표면과 방향에 걸쳐 빛을 측정하는 데 사용할 수 있는 방사량에는 여러 가지가 있습니다. 하지만 우리는 여기서 L로 표시된 반사율 방정식과 관련된 단 하나의 방사량만을 논의합니다. 방사량은 한 방향에서 오는 빛의 크기나 강도를 정량화하는 데 사용됩니다. 광도는 여러 물리량의 조합이기 때문에 처음에는 이해하기 조금 까다롭습니다. 따라서 먼저 다음 사항에 초점을 맞추겠습니다.

복사 유량: 복사 유량 Φ는 와트로 측정된 광원의 투과 에너지이다. 빛은 여러 다른 파장에 걸친 에너지의 총합으로, 각각의 파장은 특정한 (보이는) 색과 연관되어 있다. 따라서 광원의 방출 에너지는 모든 다른 파장의 함수로 생각할 수 있다. 390nm에서 700nm 사이의 파장은 가시광선 스펙트럼의 일부로 간주된다. 아래에서 일광의 파장당 다른 에너지의 이미지를 볼 수 있습니다.

복사 유량은 서로 다른 파장의 이 함수의 총 면적을 측정한다. 이 파장의 측정을 입력으로 직접 취하는 것은 약간 비현실적이기 때문에 우리는 종종 다양한 파장의 강도의 함수가 아니라 RGB로 인코딩된 밝은 색 삼중항(또는 우리가 흔히 말하는 밝은 색)으로 복사 플럭스를 표현하는 단순화를 만든다. 이 인코딩은 상당한 정보 손실을 초래하지만, 일반적으로 시각적 측면에서는 무시할 수 있다.

실각: ω로 표시된 실각은 단위 구에 투영된 형상의 크기나 면적을 알려준다. 이 단위 구에 투영된 형상의 면적을 실각이라고 하며, 실각을 부피가 있는 방향으로 시각화할 수 있습니다.

 

 

이 단위 구의 중심에 있는 관찰자가 되어 모양 방향을 바라본다고 생각해보세요; 여러분이 그 안에서 만드는 실루엣의 크기는 입체각입니다.

복사 강도: 복사 강도는 고체 각도당 복사 플럭스의 양 또는 단위 구에 투영된 영역에 대한 광원의 강도를 측정합니다. 예를 들어, 모든 방향으로 동일하게 방사되는 전방향성 빛이 주어지면, 복사 강도는 특정 영역(고체 각도)에 걸쳐 에너지를 제공할 수 있다.

 

복사 강도를 설명하는 방정식은 다음과 같이 정의된다.

여기서 I는 실각 ω에 대한 복사유량 Φ이다.

복사 유량, 복사 강도 및 고체 각도에 대한 지식을 통해 우리는 마침내 복사 방정식을 설명할 수 있다. 광도는 복사 강도 λ의 빛의 고체 각도 ω에 대한 영역 A에서 관측된 총 에너지로 설명된다.

광도(光度, radience)는 빛의 입사(또는 입사)각θ에 의해 표면의 법선으로 측정되는 영역의 광량을 측정한 것이다: 빛은 표면에 직접 방사되는 양이 적을수록 약하고 표면에 직접 수직일 때 가장 강하다. 이는 빛의 방향 벡터와 표면 법선 사이의 점 곱에 직접 대응하기 때문에 기본 조명 장에서 확산된 조명에 대한 우리의 인식과 유사하다.

float cosTheta = dot(lightDir, N);

 

빛 방정식은 우리가 관심 있는 대부분의 물리량을 포함하고 있기 때문에 꽤 유용하다. 만약 우리가 실각 ω와 면적 A가 무한히 작다고 생각한다면, 우리는 광도를 이용하여 공간의 한 점에 부딪히는 한 광선의 유량을 측정할 수 있다. 이 관계를 통해 단일(조각) 지점에 영향을 미치는 단일 광선의 광도를 계산할 수 있습니다. 실각 ω를 방향 벡터 ω로, A를 p점으로 효과적으로 변환합니다. 이러한 방식으로, 우리는 셰이더의 광도를 직접 사용하여 단일 광선의 조각당 기여도를 계산할 수 있다.

사실, 광도에 관한 한 우리는 일반적으로 p점으로 들어오는 모든 빛에 대해 신경 쓰는데, 이것은 방사광이라고 알려진 모든 광도의 합이다. 방사광과 방사광에 대한 지식을 통해 반사율 방정식으로 돌아갈 수 있습니다.

 

 

우리는 이제 렌더 방정식의 L이 어떤 점 p와 들어오는 방향 벡터 ωi로 생각할 수 있는 들어오는 무한히 작은 실각 ωi의 광도를 나타낸다는 것을 안다. cosθ는 반사율 방정식에서 nθωi로 발견되는 표면에 대한 빛의 입사 각도를 기반으로 에너지를 스케일링한다는 것을 기억하십시오. 반사율 방정식은 뷰어에 대한 발신 방향인 ωo 방향의 점 p의 반사 광도 Lo(p,ωo)의 합을 계산합니다. 또는 다르게 표현하면: Lo는 ωo에서 볼 때 빛의 반사된 조도의 합을 점 p에 측정합니다.

반사율 방정식은 우리가 빛을 측정하는 모든 입사 광도의 합인 방사광을 기반으로 한다. 단일 입사광 방향뿐만 아니라 점 p를 중심으로 한 반구 Ω 내의 모든 입사광 방향도 마찬가지입니다. 반구는 표면의 법선 n을 중심으로 정렬된 반구라고 할 수 있다.

 

면적 또는 (반구의 경우) 부피 내의 값의 합계를 계산하기 위해, 우리는 반사 방정식에서 π로 표시된 적분이라고 불리는 수학적 구조를 사용한다. 적분은 함수의 면적을 측정하는데, 이는 분석적이거나 수치적으로 계산될 수 있다. 렌더 방정식과 반사 방정식 모두에 대한 분석 솔루션이 없으므로 적분을 수치적으로 이산적으로 해결하고자 합니다. 이는 반구 Ω에 대한 반사 방정식의 작은 이산 단계의 결과를 취하고 단계 크기에 대한 결과를 평균화하는 것으로 해석된다. 이것은 리만 합으로 알려져 있으며, 다음과 같이 코드에서 대략적으로 시각화할 수 있다.

int steps = 100;
float sum = 0.0f;
vec3 P    = ...;
vec3 Wo   = ...;
vec3 N    = ...;
float dW  = 1.0f / steps;
for(int i = 0; i < steps; ++i) 
{
    vec3 Wi = getNextIncomingLightDir(i);
    sum += Fr(P, Wi, Wo) * L(P, Wi) * dot(N, Wi) * dW;
}

 

스텝을 dW 단위로 스케일링하면 합계가 적분 함수의 총 면적 또는 부피와 같아집니다. 각 이산 단계를 스케일링하기 위한 dW는 반사율 방정식에서 dωi로 생각할 수 있다. 수학적으로 dωi는 적분을 계산하는 데 사용되는 연속 기호이며, 코드의 dW와 직접 관련되지는 않지만(이것은 리만 합계의 이산 단계이기 때문에), 이렇게 생각하는 것이 도움이 된다. 개별 단계를 수행하는 것은 항상 함수의 총 면적에 대한 근사치를 제공한다는 것을 명심하십시오. 주의 깊은 독자는 우리가 단계 수를 늘림으로써 리만섬의 정확도를 높일 수 있다는 것을 알아차릴 것이다.

반사율 방정식은 적중점 p에 의해 fr로 스케일링된 반구 Ω에 대한 모든 입사광 방향 ωi의 광도를 합하고 뷰어 방향으로 반사광 Lo의 합을 반환합니다. 들어오는 광도는 우리가 익숙한 광원이나 IBL 장에서 논의하듯이 들어오는 모든 방향의 광도를 측정하는 환경 지도에서 나올 수 있습니다.

이제 알려지지 않은 유일한 왼쪽은 표면의 재료 특성에 따라 들어오는 광도를 스케일링하거나 무게를 측정하는 BRDF 또는 양방향 반사 분포 함수로 알려진 fr 기호이다.

 

BRDF

BRDF 또는 양방향 반사 분포 함수(bidirectional reflective distribution function)는 미세표면의 거칠기를 나타내는 입사(광) 방향 ωi, 출사(조망) 방향 ωo, 표면 법선 n 및 표면 파라미터 a를 입력으로 취하는 함수이다. BRDF는 재료 특성을 고려할 때 각 개별 광선 ωi가 불투명 표면의 최종 반사광에 얼마나 기여하는지 근사한다. 예를 들어, 표면이 완전히 매끄러운 표면(~거울처럼)을 가진 경우, BRDF 함수는 함수가 1.0을 반환하는 송신선 ωo와 같은 (반사된) 각도를 가진 하나의 광선을 제외한 모든 들어오는 광선 ωi에 대해 0.0을 반환한다.

BRDF는 이전에 논의된 미세 표면 이론에 기초하여 재료의 반사 및 굴절 특성을 근사화한다. BRDF가 물리적으로 그럴듯하기 위해서는 에너지 보존의 법칙을 준수해야 한다. 즉, 반사광의 합이 들어오는 빛의 양을 초과하지 않아야 한다. 기술적으로 블린퐁은 입력과 동일한 ωi와 ωo를 취하는 BRDF로 간주된다. 그러나 Blinn-Phong은 에너지 보존 원칙을 준수하지 않기 때문에 물리적으로 기반한다고 간주되지 않습니다. 빛에 대한 표면의 반응을 근사하기 위해 물리적으로 기반을 둔 여러 개의 BRDF가 있다. 그러나 거의 모든 실시간 PBR 렌더 파이프라인은 쿡-토랜스 BRDF로 알려진 BRDF를 사용한다.

Cook-Torrance BRDF는 확산(diffuse) 부분과 경면(specular) 부분을 모두 포함한다.

 

여기서 kd는 k가 반사되는 비율로 굴절되는 입사 광 에너지의 앞에서 언급한 비율이다. BRDF의 왼쪽은 여기서 플램버트로 표시된 방정식의 확산 부분을 나타냅니다. 이것은 확산 음영에 사용한 것과 유사한 램버트 확산으로 알려져 있으며, 이는 다음과 같이 표시된 상수 인자입니다.

 

c가 알베도 또는 표면 색상인 경우(확산 표면 텍스처를 생각해 보십시오). 앞서 언급한 BRDF를 포함하는 적분은 θ로 스케일링되기 때문에, 파이에 의한 나눗셈은 확산광을 정규화하기 위해 존재한다(IBL 장에서 확인할 것이다).

더보기

여러분은 이 램버트의 확산이 우리가 이전에 사용하던 확산 조명과 어떻게 관련이 있는지 궁금할 것이다: 표면의 색상과 표면의 정상과 빛의 방향 사이의 점 곱하기. 점곱은 여전히 존재하지만, Lo 적분의 끝에서 n⋅ωi를 발견함에 따라 BRDF 밖으로 이동했습니다.

 

BRDF의 확산 부분에 대한 다른 방정식이 존재하는데, 이는 더 사실적으로 보이는 경향이 있지만 계산적으로도 더 비싸다. 그러나 에픽게임즈가 결론지은 대로 램버트 확산은 대부분의 실시간 렌더링 목적에 충분하다.

BRDF의 specualr 부분은 조금 더 발전되어 있으며 다음과 같이 설명된다.

Cook-Torrance 분광형 BRDF는 분모에서 세 가지 함수와 정규화 계수로 구성된다. D, F 및 G 기호는 각각 표면의 반사 특성의 특정 부분을 근사하는 함수의 유형을 나타낸다. 정규 분포 함수, 프레넬 방정식 및 지오메트리 함수로 정의됩니다.

정규 분포 함수: 표면의 미세 면이 표면의 거칠기의 영향을 받아 중간 벡터에 정렬되는 양을 근사한다.
지오메트리 기능: 마이크로페이스의 자체 음영 특성을 설명합니다. 표면이 상대적으로 거칠면 표면의 미세표면이 다른 미세표면에 가려져 표면이 반사하는 빛을 줄일 수 있다.
프레넬 방정식: 프레넬 방정식은 서로 다른 표면 각도에서 표면 반사율을 설명한다.

 


이러한 각 함수는 물리적 등가물의 근사치이며, 기본 물리학을 다른 방식으로 근사하는 것을 목표로 하는 두 개 이상의 버전을 찾을 수 있습니다. 일부는 더 현실적이고 다른 일부는 더 효율적입니다. 이러한 기능의 대략적인 버전을 선택하여 사용할 수 있습니다. 에픽게임즈의 브라이언 카리스는 여기서 다양한 유형의 근사치에 대해 많은 연구를 했습니다. 우리는 에픽게임의 언리얼 엔진 4와 동일한 기능을 선택할 것인데, D는 트로브릿지-라이츠 GGX, F는 프레넬-슐릭 근사치, G는 스미스의 슐릭-GX다.

 

Normal Distribution Function

정규 분포 함수 D는 통계적으로 (반쪽) 벡터 h에 정확히 정렬된 미세 면의 상대 표면적을 근사한다. 약간의 거칠기 매개 변수가 주어진 미세 면의 일반적인 정렬을 통계적으로 근사하는 다수의 NDF가 있으며, 우리가 사용할 NDF는 Trowbridge-Reitz GGX로 알려져 있다.

 

여기서 h는 중간에 벡터는 표면의 미세표면에 대한 표면의 조도 있는 조치를 측정하는 것이다.만약 우리가 절반 벡터 그리고 바다 표면과 가벼운 정상적인 방향 간의 다양한 거칠기 변수 h를 얻음에 따라아래 시각적 결과를 얻는다.

 

거칠기가 낮을 때(따라서 표면이 매끄러울 때), 고도로 집중된 미세 면의 수가 작은 반경에 걸쳐 중간 벡터에 정렬된다. 이 높은 농도 때문에 NDF는 매우 밝은 지점을 보여준다. 그러나 미세표면이 훨씬 더 무작위적인 방향으로 정렬된 거친 표면에서, 여러분은 미세표면에 다소 정렬된 훨씬 더 많은 수의 중간 벡터(그러나 덜 집중된)를 발견할 것이고, 우리에게 더 회색빛 결과를 줄 것이다.

GLSL에서 Trowbridge-Reitz GGX 정규 분포 함수는 다음 코드로 변환된다.

float DistributionGGX(vec3 N, vec3 H, float a)
{
    float a2     = a*a;
    float NdotH  = max(dot(N, H), 0.0);
    float NdotH2 = NdotH*NdotH;
	
    float nom    = a2;
    float denom  = (NdotH2 * (a2 - 1.0) + 1.0);
    denom        = PI * denom * denom;
	
    return nom / denom;
}

 

 

 

Geometry Function

geometry function은 미시적인 표면 디테일이 서로 가려져 광선이 가려지는 상대 표면적을 통계적으로 근사한다.

 

NDF와 유사하게 지오메트리 함수는 재료의 거칠기 매개변수를 마이크로패턴을 무색하게 할 확률이 높은 거친 표면과 함께 입력으로 취한다. 우리가 사용할 기하 함수는 Schlick-GGX로 알려진 GGX와 Schlick-Beckmann 근사치의 조합이다.

여기서 k는 지오메트리 함수를 직접 조명 또는 IBL 조명에 사용하는지 여부에 따라 α의 재매핑입니다.

α의 값은 엔진의 거칠기를 α로 변환하는 방법에 따라 달라질 수 있습니다. 다음 챕터에서는 이 재매핑이 어떻게 그리고 어디서 관련되는지에 대해 광범위하게 논의할 것입니다.

기하학을 효과적으로 근사하기 위해서는 시야 방향(기하학 방해)과 광 방향 벡터(기하학 그림자)를 모두 고려해야 한다. Smith의 방법을 사용하면 두 가지를 모두 고려할 수 있습니다.


Schlick-GGX를 Gsub로 사용한 스미스의 방법을 사용하면 다양한 거칠기 R에 대해 다음과 같은 시각적 외관을 얻을 수 있다.

지오메트리 함수는 마이크로페이스 섀도우를 측정하지 않는 1.0(또는 흰색)과 0.0(또는 검은색) 완전 마이크로페이스 섀도우 사이의 승수입니다.

GLSL에서 지오메트리 함수는 다음 코드로 변환됩니다.

float GeometrySchlickGGX(float NdotV, float k)
{
    float nom   = NdotV;
    float denom = NdotV * (1.0 - k) + k;
	
    return nom / denom;
}
  
float GeometrySmith(vec3 N, vec3 V, vec3 L, float k)
{
    float NdotV = max(dot(N, V), 0.0);
    float NdotL = max(dot(N, L), 0.0);
    float ggx1 = GeometrySchlickGGX(NdotV, k);
    float ggx2 = GeometrySchlickGGX(NdotL, k);
	
    return ggx1 * ggx2;
}

 

 

프레넬 방정식(Fresnel equation)

프레넬 방정식은 굴절되는 빛에 반사되는 빛의 비율을 설명하는데, 이는 우리가 표면을 보는 각도에 따라 달라진다. 빛이 표면에 닿는 순간, 표면 대 시야 각도를 기준으로 프레넬 방정식은 반사되는 빛의 비율을 알려줍니다. 이 반사율과 에너지 보존 원리로부터 우리는 빛의 굴절 부분을 직접 얻을 수 있다.

모든 표면 또는 물질은 표면을 똑바로 볼 때는 기저 반사율 수준을 갖지만, 각도에서 표면을 볼 때는 표면의 기저 반사율에 비해 모든 반사가 더 뚜렷해진다. 수직 시야각에서 일정 수준의 기본 반사율을 가진 나무/금속 책상을 보면 이 점을 직접 확인할 수 있지만, 거의 90도 각도에서 책상을 보면 반사율이 훨씬 더 뚜렷해지는 것을 볼 수 있습니다. 모든 표면은 이론적으로 완벽한 90도 각도에서 보면 빛을 완전히 반사한다. 이 현상은 프레넬로 알려져 있으며 프레넬 방정식으로 설명된다.

프레넬 방정식은 다소 복잡한 방정식이지만, 다행스럽게도 프레넬-슐릭 근사치를 사용하여 근사할 수 있다.

 

F0은 표면의 기본 반사율을 나타내며, 굴절률 또는 IOR라고 불리는 것을 사용하여 계산합니다. 구면 표면에서 볼 수 있듯이 표면의 방목 각도(중간 시야 각도가 90도에 도달함)를 더 많이 볼수록 프레넬은 더 강해지고 그에 따라 반사됩니다.

 

프레넬 방정식과 관련된 몇 가지 미묘한 점이 있다. 하나는 프레넬-슐릭 근사치가 유전체 또는 비금속 표면에 대해서만 실제로 정의된다는 것이다. 도체 표면(금속)의 경우, 굴절 지수로 기본 반사율을 계산하는 것은 적절하게 유지되지 않으며 도체에 대해 다른 프레넬 방정식을 함께 사용해야 합니다. 이것이 불편하기 때문에, 우리는 표면을 직접 보는 것처럼 0도 각도에서 정상 입사(F0)에서 표면의 반응을 사전 계산하여 추가로 근사치를 구한다. 우리는 프레넬-슐릭 근사치에 따라 시야각을 기반으로 이 값을 보간하여 금속과 비금속 모두에 동일한 방정식을 사용할 수 있다.

정상 발생(normal incidence) 시 표면의 반응 또는 기본 반사율은 다음과 같은 대형 데이터베이스에서 찾을 수 있으며, Naty Hoffman의 코스 노트에서 가져온 다음과 같은 더 일반적인 값 중 일부를 확인할 수 있다.

 

여기서 관찰할 수 있는 흥미로운 점은 모든 유전체 표면에서 기본 반사율이 규칙보다는 예외인 0.17을 넘지 않는 반면, 도체의 경우 기본 반사율이 훨씬 더 높게 시작되고 (대부분) 0.5와 1.0 사이에서 변화한다는 것이다. 또한, 도체(또는 금속 표면)의 경우, 베이스 반사율이 착색된다. 이것이 F0이 RGB 삼중항(정상 발생 시 반사율은 파장마다 다를 수 있음)으로 표시되는 이유이다.

유전체 표면에 비해 금속 표면의 이러한 특정 특성은 금속 작업 흐름이라고 불리는 것을 발생시켰다. 금속 작업 흐름에서 우리는 표면이 금속 표면인지 비금속 표면인지를 설명하는 금속성으로 알려진 추가 매개 변수를 가진 표면 재료를 작성합니다.

더보기

이론적으로, 물질의 금속성은 이진법입니다. 그것은 금속이거나 그렇지 않습니다. 둘 다일 수는 없습니다. 그러나 대부분의 렌더 파이프라인은 표면의 금속성을 0.0과 1.0 사이의 선형으로 구성할 수 있다. 이것은 대부분 재료 질감의 정밀도가 부족하기 때문입니다. 예를 들어, 금속 표면에 작은 먼지/모래와 같은 입자/스크래치가 있는 표면은 이진 금속성 값으로 렌더링하기 어렵다.

 

유전체와 도체 모두에 대해 F0을 사전 계산함으로써 두 유형의 표면에 대해 동일한 프레넬-슐릭 근사치를 사용할 수 있지만, 금속 표면이 있는 경우 기본 반사율을 색조해야 합니다. 일반적으로 다음과 같은 작업을 수행합니다.

vec3 F0 = vec3(0.04);
F0      = mix(F0, surfaceColor.rgb, metalness);

우리는 대부분의 유전체 표면에 대해 근사한 기본 반사율을 정의한다. 이것은 F0이 대부분의 일반적인 유전체 주변에서 평균화되기 때문에 또 다른 근사치이다. 0.04의 기본 반사율은 대부분의 유전체에 대해 유지되며 추가적인 표면 매개 변수를 작성할 필요 없이 물리적으로 그럴듯한 결과를 생성한다. 그런 다음 표면이 얼마나 금속적인지에 따라 유전체 기반 반사율을 취하거나 표면 색으로 작성된 F0을 취합니다. 금속 표면이 모든 굴절된 빛을 흡수하기 때문에 확산 반사가 없고 우리는 표면 색감을 기본 반사율로 직접 사용할 수 있다.

코드에서 프레넬 슐릭 근사는 다음을 의미한다.

vec3 fresnelSchlick(float cosTheta, vec3 F0)
{
    return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
}

cos와 함께세타는 표면의 정상 n과 중간 h(또는 view v) 방향 사이의 결과이다.

 

Cook-Torrance reflectance 방정식

쿡-토랜스 BRDF의 모든 구성 요소를 설명하면, 우리는 물리적으로 기반을 둔 BRDF를 현재 최종 반사 방정식에 포함할 수 있다.

그러나 이 방정식은 수학적으로 완전히 정확하지는 않다. 프레넬 항 F는 표면에 반사되는 빛의 비율을 나타낸다는 것을 기억할 수 있습니다. 이것은 반사율 방정식의 스펙트럼(BRDF) 부분이 암시적으로 반사율을 포함한다는 것을 의미하는 사실상 우리의 비율이다. 이를 고려할 때, 최종 반사 방정식은 다음과 같다.

이 방정식은 이제 우리가 일반적으로 이해하는 물리적 기반 렌더링 또는 PBR로 인식되는 물리적 기반 렌더링 모델을 완전히 설명합니다. 논의된 모든 수학을 코드에서 어떻게 조합해야 하는지 아직 완전히 이해하지 못하셨더라도 걱정하지 마십시오. 다음 챕터에서는 반사율 방정식을 활용하여 렌더링된 조명에서 물리적으로 훨씬 더 그럴듯한 결과를 얻을 수 있는 방법을 살펴보고 모든 비트와 조각이 천천히 서로 맞기 시작할 것입니다.

 


PBR Materials 작성

PBR의 기본 수학적 모델에 대한 지식을 바탕으로 예술가들이 일반적으로 PBR 방정식에 직접 공급할 수 있는 표면의 물리적 특성을 어떻게 작성하는지 설명함으로써 논의를 마무리할 것이다. PBR 파이프라인에 필요한 각 표면 매개변수는 텍스처에 의해 정의되거나 모델링될 수 있다. 텍스처를 사용하면 각 특정 표면 점이 빛에 어떻게 반응해야 하는지, 즉 금속성, 거칠거나 매끄러운지 또는 표면이 다른 파장의 빛에 어떻게 반응하는지 조각별로 제어할 수 있습니다.

아래에는 PBR 렌더러에 제공되는 시각적 출력과 함께 PBR 파이프라인에서 자주 볼 수 있는 텍스처 목록이 나와 있습니다.

 

알베도(Albedo): 알베도 텍스처는 각 텍셀에 대해 표면의 색을 지정하거나, 텍셀이 금속인 경우 기본 반사율을 지정합니다. 이것은 우리가 이전에 확산 텍스처로 사용하던 것과 대체로 비슷하지만, 모든 조명 정보는 텍스처로부터 추출됩니다. 확산 텍스처는 알베도 텍스처에서는 원하지 않는 이미지 내부에 약간의 그림자 또는 어두운 틈이 있는 경우가 많으며 표면의 색상(또는 굴절된 흡수 계수)만 포함해야 합니다.

노말(Normal): 일반 맵 텍스처는 이전에 일반 매핑 장에서 사용한 것과 동일합니다. 정규 지도는 조각마다 표면이 평평한 것에 비해 범프하다는 착각을 주기 위해 고유한 정규를 지정할 수 있게 해준다.

메탈릭(Metallic): 메탈릭 맵은 텍셀 당 텍셀이 메탈릭인지 아닌지를 지정합니다. PBR 엔진 설정 방법에 따라 예술가는 금속성을 그레이스케일 값 또는 이진 검정 또는 흰색으로 작성할 수 있습니다.

거칠기(Roughness): 거칠기 맵은 표면의 거칠기를 텍셀 단위로 지정합니다. 거칠기의 샘플링된 거칠기 값은 표면의 통계적 미세 표면 방향에 영향을 미친다. 거친 표면은 더 넓어지고 반사는 더 흐려지는 반면, 매끄러운 표면은 초점을 맞추고 선명하게 반사됩니다. 일부 PBR 엔진은 일부 예술가들이 더 직관적이라고 생각하는 거칠기 맵 대신 평활도 맵을 기대한다. 그런 다음 이러한 값은 샘플링되는 순간 거칠기로 변환됩니다(1.0 - smoothness).

AO: 주변광 차폐(Ambient Occulsion) 또는 AO 맵은 표면과 잠재적으로 주변 형상에 대한 추가 음영 계수를 지정합니다. 예를 들어 벽돌 표면이 있다면 알베도 텍스처는 벽돌의 틈새 안에 그림자 정보가 없어야 합니다. 그러나 AO 맵은 빛이 빠져나오기 더 어렵기 때문에 이러한 어두운 모서리를 명시한다. 조명 단계가 끝날 때 주변 가려짐을 고려하면 장면의 시각적 품질이 크게 향상될 수 있습니다. 메쉬/서페이스의 주변 폐색 맵은 수동으로 생성되거나 3D 모델링 프로그램에서 사전 계산됩니다.

예술가들은 이러한 물리적으로 기반된 입력 값을 텍셀 단위로 설정하고 조정하며, 실제 재료의 물리적 표면 특성을 기반으로 텍스처 값을 설정할 수 있다. 이것은 PBR 렌더 파이프라인의 가장 큰 장점 중 하나이다. 표면의 이러한 물리적 특성은 환경이나 조명 설정에 관계없이 동일하게 유지되기 때문에 예술가들이 물리적으로 그럴듯한 결과를 쉽게 얻을 수 있다. PBR 파이프라인에서 작성된 서페이스는 여러 PBR 렌더 엔진 간에 쉽게 공유할 수 있으며, 환경에 관계없이 올바르게 표시되며, 결과적으로 훨씬 더 자연스럽게 보입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

댓글