Programming/컴퓨터그래픽스 (DX 11)

[PBR] 4. BRDF

양양줘 2025. 12. 5. 16:50

 

 

 

이번 글은 PBR에서 다루는

BRDF의 수식 이해를 위한 정리글이다.

 

 

 

빛 표면 시뮬레이션 모델 BSDF


  BSDF(Bidirectional Scattering Distribution Function)표면에서 매질과 상호작용한 빛이 어떤 방향으로 흩어지는 전체 현상을 다루는 함수로 반사(reflection)과 투과(transmission)/굴절(refraction)이 모두 포함된다. 즉, BSDF는 반사를 다루는 BRDF와 투과/굴절을 다루는 BTDF를 모두 포함한 개념이며 보통 PBR에서는 BRDF만 다룬다.

 

BSDF 안에는 다음과 같은 특성이 포함된다:

  • BRDF (Bidirectional Reflectance Distribution Function) : 반사(specualr + diffuse(표면산란))
  • BTDF (Bidirectional Transmittance Distribution Function) : 투과/굴절
  • BSSRDF (Bidirectional Surface Scattering Reflectance Distribution Function) : 표면 아래에서 산란 후 나오는 빛 (Subsurface Scattering (SSS))

 

BSDF가 준수해야 하는 조건

 

1. 에너지 보존
 나가는 빛의 총 에너지는 들어오는 에너지를 초과할 수 없다.

입사된 빛 양 == 반사 + 흡수 + 표면산란 + 투과 
            >= 나가는 빛의 양

 

2. 상호성

 입사 방향과 출사 방향을 바꿔도 동일한 결과를 제공해야 한다.

 

3. 물리적 타당성

 실제 재료의 빛 상호작용을 정확히 모델링해야 한다. 여기에는 반사, 흡수, 투과, 산란 현상의 올바른 구현이 포함된다. 미세면(Microfacet) 모델이 물리적 타당성을 달성하는 현대적 접근이다.

 

 

H (half-vector) 하프벡터


H = normalize(L + V);

 

  정반사가 일어나려면 입사각과 반사각이 같아야 하므로, 빛이 들어오는 방향 L과 눈이 보는 방향 V가 법선을 기준으로 대칭이 되어야 한다. 따라서 정반사가 발생하는 지점의 법선은 L과 V의 중간 방향이며, 그게 바로 H 벡터다.

그러므로, 미세면 모델에서는 반사가 일어나기 위해 ‘미세면의 법선 = H’를 가정한다.

  • 입사각 : 광원(L)과 하프벡터(H) 각도
  • 반사각 : 하프벡터(H)와 뷰벡터(V) 각도

 미리 말하자면, 미세면은 거칠기에 따라 다양한 방향의 법선을 가지고 있으므로, 반사를 구하는 BRDF에서는 전체 미세면들 중 H방향이 법선인 미세면의 비율을 구하는 함수(GGX)를 포함한다.

 

 

 

 

 

 

BRDF (양방향 반사 분포 함수)


  BRDF(Bidirectional Reflectance Distribution Function)는 투과 없는 불투명 표면에서 빛이 입사했을 때, 어느 방향으로 얼마나 나가는지 결정하는 함수이다. 즉, 반사(specualr)와 표면산란(diffuse)를 다룬다.

 

 하나의 표면의 최종색상을 구하는 BRDF의 식은 다음과 같다.

최종 색상 = (SpecularBRDF+DiffuseBRDF) × radiance × (N⋅L)

 

의미
SpecularBRDF 입사광량 중 표면에서 바로 반사되는 비율 flaot3 (RGB)
DiffuseBRDF 입사광량 중 표면 산란 되는 비율 flaot3 (RGB)
radiance 입사광량 (Li) flaot3 (RGB)
(N⋅L) 이 표면에 얼마나 강하게 도달하는가(입사 각도 보정) flaot (0~1)

 

 표면에서 반사되는 빛은 SpecualrBRDF를 통해 계산되고, 흡수-방출 과정을 거치는 표면 산란은 DiffuseBRDF를 통해 계산된다.

입사한 빛 100% = 반사율(kS) + 표면 산란 비율(kD)

 

 

 radiance는 표면에 입사한 빛의 강도(RBG 스펙트럼)를 의미하고, NdotL은 그 빛이 표면에 실제로 닿는 에너지 비율을 나타낸다. 즉, radiance * NdotL은 ‘표면에 실제로 도달한 입사광(irradiance)’을 의미한다.

정리하자면, BRDF 함수는 입사광(radiance * NdotL)에 대해 SpecularBRDF와 DiffuseBRDF를 이용해 반사·산란 비율을 결정하고, 그 비율만큼의 RGB 에너지를 최종 반사광으로 계산한다.

 

 

1.   Specular BRDF (Cook-Torrance)

 Cook-Torrance Specular BRDF는 미세면 모델(Microfacet model)을 기반으로 한 정반사 셰이딩 모델로 입사광중 정반사되는 비율(RGB)를 구한다. 앞선 글에서 미세면 모델을 기반으로 한 specular 계산 요소를 정리할때 D, F, G 함수가 뭔지 대략적으로 이야기 했었다. Cook-Torrance Specular BRDF에서는 D, G는 GGX, F는 FSchlick 근사식을 사용한다.

 

D (Normal Distribution Function, 법선 분포 함수)
  : 하프벡터(H)가 법선방향인 미세면의 확률 밀도를 구하는 함수 (결과 flaot)

 

[ 수식 해석 ]

// GGX Normal Distribution Function (D)
// 입력
n : 표면 법선 (Normal)
h : 하프 벡터 (Half-vector, 정반사를 위한 미세면의 법선)
α : 거칠기(r)를 분포 폭으로 변환한 값. α = r^2

// 각 항의 의미
α²  
    → roughness의 제곱
    → 거칠기가 작을수록 분포가 좁고 날카로워지고, 크면 넓게 퍼짐

(N·H)  
    → 미세면의 평균 방향이 H와 얼마나 정렬되어 있는지
    → 1이면 거의 같은 방향(강하게 반사), 
      0이면 거의 기여 없음

(N·H)² * (α² - 1) + 1  
    → μ = (N·H) 에 roughness 효과를 적용한 “분포 폭 조절 항”
    → α가 작을 때는 μ가 법선 주변에 집중되고
      α가 클 때는 μ가 넓게 퍼지도록 변화
    → +1은 분모가 0으로 가는 불안정성 방지

// 결과값
D = (α²) / ( π * ( (...) )² )
    → 특정 방향(H)을 향한 미세면의 밀도(확률)
    → 이 값이 클수록 H 방향으로 정렬된 미세면이 많다는 의미

 

 

[ 결과 해석 ]

  • D 값이 크다면?
    • H 방향을 향한 미세면이 많이 존재함
    • 하이라이트가 좁고 강하게 나타남 (샤프한 스펙큘러)
  • D 값이 작다면?
    • H 방향을 향한 미세면이 적음
    • 하이라이트가 넓고 약하게 나타남 (러프한 표면 느낌)
  • Roughness에 따른 D의 결과
    • α(roughness)가 작다 = 매끈한 표면
      • D가 법선 방향에 매우 집중됨
      • 하이라이트가 날카롭고 밝아짐
    • α가 크다 = 거친 표면
      • D가 넓게 퍼짐
      • 하이라이트가 부드럽고 넓어짐

 

F (Fresnel Reflection, 프레넬 반사 함수)
  : F0과 시선의 비스듬함(H·V)에 따라, 입사광 중 Specular로 반사되는 비율을 구하는 함수. (결과 float)

 

[ 수식 해석 ]

// FSchlick : Fresnel-Schlick Approximation
//    -> Fresnel 효과를 계산하기 위한 가장 널리 쓰이는 근사식
//    -> 시선이 비스듬할수록 반사율이 급격히 증가하는 현상을 단순하고 빠르게 계산

// 입력
n : 표면 법선 (Normal)
v : 시선 벡터 (View)
F0 : 정면 반사율(Normal-incidence reflectance)

// 각 항의 의미
F0
   -> 정면 반사율
   -> 금속 : 금속 고유의 RGB
   -> 비금속 : 0.04f

(1 - F0)
   -> 반사되지 않고 표면 산란(diffuse)되는 비율
   
HdotV
	 -> 미세면의 법선(H)과 뷰 방향(V)의 각도
	 -> 1에 가까울수록 시선이 정면에 가까워 반사가 약함
	 -> 0에 가까울수록 시선이 매우 비스듬해져 반사가 강해짐
   
(1 - F0) * (1 - HdotV)^5
	 -> 시선이 비스듬할때 반사율이 증가하는 양

즉,
F0 : 무조건 반사하는 비율
(1 - F0) * (1 - HdotV)^5 : 나머지중 시선의 비스듬함에 따라 반사되는 비율
이다.

// 결과
F = F0 + (1 - F0) * (1 - HdotV)^5
	 -> 입사각(H·V)에 따라 반사 비율을 보정한 최종 Specular 비율
   -> 결과는 float3 (RGB)

 

 

[ 결과 해석 ]

  • F가 클수록?
    • 거의 반사됨 (specular)
    • F0이 크거나, 시선이 비스듬할때 F 증가
  • F가 작을수록?
    • 거의 반사되지 않음 (diffuse)
    • F0이 작거나, 시선이 정면일때 F 감소
  • F0과의 관계
    • F0이 크다면 시선에 상관없이 반사되기 때문에 정면에서 보건, 비스듬하게 보건 대부분이 반사된다.
    • F0이 작다면 시선의 영향을 많이 받아 비스듬하게 볼수록 반사율이 급격하게 증가한다.



 

G (Geometry / Shadowing-Masking Function)
  : 미세면이 가려지지 않고 실제로 반사되는 비율을 구하는 함수. (결과 float)

 

Gsub(n,l,k)은 Shadowing되지 않는 비율, Gsub(n,v,k)는 Masking되지 않는 비율을 도출한다. Shadowing과 Masking을 합한 값이 가려지지 않고 제대로 반사되는 최종 비율이다.

 

[ 수식 해석 ]

// GSchlickGGX
// 입력
n : 표면 법선 (Normal)
v : 시선 벡터 (View)
l : 광원 벡터 (Light)
α : 표면 거칠기 (Roughness)
k : 거칠기 기반 보정 상수    k = (α+1)^2/8

// 각 항의 의미
n·v
		-> 표면 법선과 시선 벡터 사이의 각도
		-> 1에 가까울수록 정면, 0에 가까울수록 비스듬
		-> 값이 작아지면(비스듬) 일부 미세면이 가려짐

(n·v)(1-k)+k
	  -> k를 이용해 거칠기와 시선 각도에 따른 가려지는 양 보정
    -> 거칠수록 분모 증가 → Gsub 감소

n·v/(n·v)(1-k)+k
	  -> N-V 방향에서 가려지지 않고 반사되는 비율
    -> 0 ~ 1
    -> 1이면 가려짐 없음, 0이면 대부분 가려짐

// 최종 G 계산
G = Gsub(N·V, k) * Gsub(N·L, k)
		-> 시선과 광원 방향에서 가려지지 않은 미세면 비율
    -> 값이 1이면 완전히 가려지지 않음, 0이면 대부분 가려짐

 

 

[ 결과 해석 ]

  • N·V 사이각이 커지고, 거칠기(α)가 클수록 ?
    • 표면이 거칠고 시선이 비스듬 → 일부 미세면이 그림자에 가려짐
    • G 값 작음(0)→ 반사 감소
  • N·V 사이각이 작고, 거칠기(α)가 작을수록?
    • 표면 매끄럽고 시선이 정면 → 대부분 미세면이 가려지지 않음
    • G 값 큼(1) → 반사 강함

 

 

 

 

2.  Diffuse BRDF

Diffuse BRDF입사광중 표면산란(흡수-산란-방출)된 빛의 강도(RGB)를 구한다.

cdiff    : 표면 색상 (Base Color, albedo)
kd       : diffuse 반사 강도 (1 - F(H·V))

 

 

 

3.  최종 BRDF 계산

최종 색상 = (SpecularBRDF + DiffuseBRDF) × radiance × (N⋅L)

 

앞서 쓴 코드를 다시 보자. SpecularBRDF와 DiffuseBRDF를 이해하고 나면 위 식이 직관적으로 보일 것이다.

이렇게 최종 색상을 구할 수 있다!

 

의미
SpecularBRDF 정반사 기여 (하이라이트 포함)
DiffuseBRDF 산란 기여 (하이라이트 없음, 색상 중심)
radiance 표면에 도달한 입사광 세기
N·L 입사각 보정 (광원이 표면과 이루는 각)

 

 

 

 

 

 

 

 


BRDF 결과 예상해보기!

 

상황 SpecularBRDF DiffuseBRDF 최종 반사 색상
매끄러운 금속, 빛 정면 강함 거의 없음 금속 색 반사, 날카로운 하이라이트
거친 금속, 빛 비스듬 중간 거의 없음 금속 색 반사, 흐린 하이라이트
매끄러운 비금속, 빛 정면 중간 강함 표면 색 + 약간 반사, 하이라이트 뚜렷
거친 비금속, 빛 비스듬 약함 강함 표면 색 중심, 넓고 부드러운 반사