유니티 쉐이더 기본 - 빛

그래픽스꿀잼·2026년 4월 1일

그래픽스

목록 보기
2/20
post-thumbnail

빛(조명) 구성요소

빛을 구성하는 3대 요소가 있음

Ambient

  • 주변광
  • 광원에 직접적으로 받는 빛이 아니라, 주변 물체에서 반사된 빛을 통해 받는 빛임
  • 예를들어 주황색 유리에 반사된 빛은 주황색 빛을 띄게 됨

Diffuse

  • 분산광, 난반사
  • 광원에 의해 물체의 표면에 직접적으로 닿은 빛이 반사되어 보이는 빛

Specular

  • 정반사
  • 반사되어 빛나는 재질을 만들때 사용

이런식으로 빛 반사의 조합을 이용하여 표면재질을 만들어냄


램버트 조명 모델

표면의 법선 벡터(Normal)와 빛의 방향 벡터(Light Direction)의 내적(dot product, 두 벡터사이의 각도)으로 빛을 계산함

이렇게 법선 벡터와 빛 벡터 사이의 내적이 크면(두 벡터가 비슷한 방향일때) 많은 빛을 반사하고

이렇게 법선 벡터와 빛 벡터 사이의 내적이 작으면(두 벡터가 다른 방향일때) 적은 빛을 반사함


이렇게 벡터가 90도를 (내적 < 0) 넘어가면 빛 반사가 안됨

또 카메라 앵글은 램버트 빛 계산에 영향을 미치지 않음


내적


두 벡터가 평행할수록 내적(코사인)은 1에 가까워지고


두 벡터가 수직에 가까울수록 내적(코사인)은 0에 가까워짐

각도가 90도 이상이라면 음수가 되어
180도면 -1이 됨

빛의 강도 조절

I=NLcos(α)CAI = \left| N \right|\left| L \right| cos(α) * C * A
NL=NLcos(α)N \cdot L = \left| N \right| \left| L \right| cos(α)
가 공식임

I = Intensity
N = Normal Vector, 법선 벡터
L = Light Vector, 빛 벡터
cos(α) = 두 벡터사이의 내적
C = Color
A = Attenuation, 감쇠(빛의 거리에 따른 세기 감소)


쉐이더 그래프로 이를 표현하면

이렇게 된다.

다만 unlit쉐이더에서 빛을 사용하는 코드를 작성하는건 쉐이더를 올바르게 사용하는 법이 아님

빛을 사용하는 쉐이더는 lit쉐이더로, lit에서 사용할 수 있는 방법을 찾아야함


퐁 쉐이딩 / 블린-퐁 쉐이딩 & 공식

퐁 쉐이딩

퐁쉐이더는 기본적으로 위에 설명한 빛의 3가지 구성요소 모두를 사용하여 빛을 만드는 쉐이딩 기법임

specular

특히 specular부분이 중요한데,

빛과 법선벡터의 내적과 같은 각의 반사각이 결정되고,
해당 반사각으로 부터 viewer의 내적을 계산하여 빛의 반사 강도를 표현하는 기법임

Falloff

  • 얼마만큼 빛번짐이 되는지
  • Specular=(RV)nSpecular = (R \cdot V)^n
    • R : Reflection Vector, V : View Vector
    • R=2(LN)NLR = 2(L \cdot N)N - L
  • n(Shininess)가 작으면 slow falloff가 되어 더 많은 구역에 빛 반사가 되고
  • n(Shininess)가 크면 fast falloff가 되어 더 적은 구역에 집중적으로 빛 반사가 이루어짐


이런 차이임

블린 퐁 쉐이딩

퐁 쉐이딩의 specular를 정반사각을 이용하지 않고
하프 벡터를 이용해 specular를 계산하여 쉐이딩하는 기법임

half vector specular

퐁 쉐이더는 반사각을 계산해서 빛과 법선 벡터 사이의 내적과 같은 내적의 크기를 가지는 반사 벡터를 만들어 사용함

블린 퐁은 viewer와 빛 벡터의 중간 벡터를 이용해 반사 벡터를 계산하여 사용함

half=L+Vhalf = L + V
그래서

Falloff

  • Specular=((L+V)N)n=(HN)nSpecular = ((L+V) \cdot N)^n = (H \cdot N)^n
  • L : Light, V : View, H : Half, N : Normal

그리고 법선 벡터와 half 벡터의 내적은 intensity임

퐁 쉐이딩, 블린 퐁 쉐이딩 공식

퐁 쉐이딩 공식

S=saturate(RV)nS = saturate(R \cdot V)^{n}
D=saturate(NL)CAD = saturate(N \cdot L) * C * A
S+DS + D

  • R=2(NL)NLR = 2(N \cdot L)N - L
  • KaK_a: 주변광 강도(0~1),
    LL: 빛 벡터,
    NN: 법선 벡터,
    CC: 색,
    AA: Attenuation 감쇠,
    RR: 반사 벡터,
    VV: 뷰어 벡터,
    nn: specular falloff

블린 퐁 쉐이딩 공식

S=saturate(L+VN)nS = saturate(|L + V| \cdot N)^{n}
D=saturate(NL)CAD = saturate(N \cdot L) * C * A
S+DS + D

  • LL = 빛 벡터
    SS = Specular
    DD = Diffuse
    NN = 법선 벡터
    VV = 뷰어 벡터
    nn = falloff
    CC = 색
    AA = Attenuation 감쇠


PBR (Physical based rendering)

위의 3가지 쉐이딩은 현실세계의 빛과는 차이가 많음

  1. 에너지 보존

위의 3가지 쉐이딩은 무한히 밝아짐
하지만 현실의 빛은 무한히 밝아지지 않음

반사광 + 굴절광 ≤ 입사광

  1. 재질에 따라 다른 빛 반사 표현 불가

metalic, roughness에 따라 빛 반사가 다르고,
표현되는 빛이 다른데,
위의 3가지 쉐이딩 기법은 그걸 표현 못함

  1. 조명 의존적
    조명에 따라 재질이 바뀌어보여 수작업 필요

이러한 문제점을 보완하기 위해 등장한것이
PBR임


전체적으로 보면
Incedent(빛)이 반사되면, Normal을 기준으로 입사각과 반사각이 같음
하지만 일부는 굴절되어 표면 안으로 들어가 산란됨
또 물체 재질에 따라 흡수되어 고유 색상을 결정함

핵심 개념 7가지가 있음

  1. Reflection

정반사임.
단순히 Specular만이 아닌,
Fresnel, Microsurface까지 포함한 총체적인 반사 개념임

  1. Diffuse

난반사로, 빛이 표면 내부로 들어갔다가 산란되어 나오는 것임
금속(Metallic) 재질은 Diffuse가 없고, 비금속만 Diffuse가 있음

  1. Transparency and Translucency

투명, 반투명임

  1. Conservation of Energy

물체가 받는 에너지보다 많은 에너지를 반사하지 않도록 하는거임

  1. Metallicity

금속성임
금속은 Diffuse = 0, Specular = 강함
비금속은 Diffuse = 있음, Specular = 약함

  1. Fresnel Reflectivity

프레넬 반사율임
시선이 표면에 수직(물체 중앙)일수록 반사가 약하고,
수평(테두리)에 가까울수록 반사가 강해지는 현상임
표면 재질에 따라 프레넬 반사율이 달라짐

  1. Microsurface Scattering

Roughness에 해당되는거임
Roughness가 높을수록 표면 미세 굴곡이 많아져 빛이 넓게 산란됨

BRDF

Bidirectional Reflectance Distribution Function
양방향 반사율 분포 함수

뭔소리야... 싶겠지만
사진을 보면 이해가 쉬움

물체의 재질에 따라 물체 표면에 반사되는 걸 결정하는 함수임

Microfacet과 Fresnel이 핵심개념임

PBR 공식

Lo(p,ωo)=Ωfr(p,ωi,ωo)Li(p,ωi)(nωi)dωiL_o(p, \omega_o) = \int_{{\Omega}} f_r(p, \omega_i, \omega_o) L_i(p, \omega_i)(n \cdot \omega_i) d\omega_i

  • Lo(p,ωo)L_o(p, \omega_o) : 점 p에서 뷰 방향 wow_o으로 나가는 빛의 양
    pp : 표면 위의 점
    ωo\omega_o : 빛이 나가는 방향
    ωi\omega_i : 빛이 들어오는 방향
    Ω{\Omega} : 반구, 빛이 들어오는 모든 방향
    Ω...dωi\int_{\Omega}...d\omega_i : 반구 내 모든 입사 방향에 대한 합산
    fr(p,ωi,ωo)f_r(p, \omega_i, \omega_o) : BRDF, 입사광이 얼마나 반사되는지
    Li(p,ωi)L_i(p, \omega_i) : 방향 ωi\omega_i에서 들어오는 빛의 양
    nωin\cdot\omega_i : 법선과 방향 ωi\omega_i의 내적, 둘 사이의 각

BRDF는 입사광이 얼마나 반사되는지를 의미함
즉 재질의 특성임

예를들어 강물을 보면
강물을 수직으로 바라보면 물 속이 보이지만
약간 비스듬하게 보면 주변의 풍경이 반사되어 보일거임

이렇게 ㅇㅇ

Microfacet은 PBR에서 모든 표면은 미세하게라도 울퉁불퉁하다는것을 의미하고
Fresnel은 보는 각도(입사각)에 따라 반사되는 빛의 비율이 달라지는 현상임

subsurface scattering

반투명한 물체의 경우, 물체 내부에서도 빛이 산란되어 보이게 된다.

위의 손처럼 빛의 일부가 굴절되고 흡수되어 입사된 표면이 아닌 다른 표면으로 빛이 빠져나오게 된다.

이러한 현상을 subsurface scattering이라고 부름


이렇게 BRDF(Microfacet, Fresnel), 에너지 보존, Subsurface Scattering 등 물리 법칙을 기반으로 한 빛 모델이 PBR임

Vertex lighting VS Pixel lighting

Vertex는 정점임
정점은 3d메쉬를 구성하는 각 꼭지점임

pixel은 3d메쉬의 정점이 폴리곤(삼각형)을 만들고, 폴리곤 내부를 rasterization을 통해 채운게 픽셀이 되는거임

vertex lighting은 정점마다 색을 계산하고
내부의 픽셀은 보간을 통해 색을 계산함

pixel lighting은 모든 픽셀을 전부 계산함

주 차이점은 아래와 같음

Vertex LightingPixel Lighting
조명 계산 위치꼭짓점마다픽셀마다
연산 비용가벼움무거움
품질낮음 (폴리곤 티가 남)높음 (부드럽고 정확)
Specular 표현부정확 (뭉개짐)정확 (선명함)

파노라마, 텍스쳐 큐브 사용법

텍스쳐 큐브 사용법

이런건 텍스쳐 큐브라고 부른다

텍스쳐큐브는

이렇게 큐브를 눌러주고 apply를 하면

이런 큐브맵이 된다

파노라마 사용법

이런건 파노라마라고 부른다.
spherical map? 정도로 부르는것 같음

이렇게 큐브와 mirrored ball을 선택하고 apply를 하면

이런 큐브맵이 된다

reflection probe

물체를 그대로 반사하기 위한 방법임

먼저 reflection probe라는 light오브젝트를 만들어야함

박스 사이즈를 조절해서 어느 구간까지 reflection을 할건지 정하셈

그리고 반사되었으면 하는 오브젝트들을

이렇게 두개를 설정하셈


그리고 bake를 누르면


이렇게 반사가된 probe가 나오게 됨

이제 이거를 원하는 오브젝트에 머티리얼로 넣으면 됨


이렇게 base color와 emission으로 넣어주면

이렇게 됨

profile
그래픽스 공부중

0개의 댓글