Lighting

CuriHuS·2024년 6월 4일

Game Graphics

목록 보기
6/9

Pixel Shader에서 진행됨

  • 보통 널리 쓰이는 것이 Phong model
    • Diffuse
    • Specular
    • Ambient
    • Emissive

Light Sources

Point light

  • 한 점에서 모든 방향으로 발산함
  • 멀어질수록 밝기가 약해짐

Directional light

  • 한 방향으로 균일하게 빛을 비춘다
  • 빛의 밝기가 거리와 관계 없음

Spotlight

  • 원뿔 모양으로 빛을 낸다
  • 원뿔의 중앙과 광원에 가까워지면 빛이 세짐

Ambient

  • 광원이 없음(상수)
  • 완전 균일한 밝기

Diffuse

직선광이 표면에 부딪혔을 때 흩뿌려지는 빛을 의미함
-> 균일하게 분산된다

  • Lambert 법칙에 의해 모든 방향, 세기로 표면으로부터 흩뿌려진다
  • 빛은 view와 독립적이므로 동일한 양의 빛이 흩뿌려짐

  • 0도일 때 머리 위, 90도 일 때 지평선, 90도보다 크면 지평선 아래

  • max(nl,0)max(n·l, 0), sds_d는 광원의 색, mdm_d는 물체 material의 diffuse 반사율


mdm_d는 위의 그림처럼 diffuse light의 색을 바꿀 수 있음

Specular

표면에 빛이 닿았을 때 빛나는 부분

  • diffuse와 달리 specular는 view에 의존적임
  • 완전히 빛나는 표면을 위해서는 ρ가 0이어야 함, 0이 아니면 ρ가 커질 수록 약해짐
  • sh: shininess
  • sh가 커질수록 더 가파르게 떨어진다
  • 실제 구현에서는 (max(rv,0))shss(max(r·v, 0))^{sh}s_s x msm_s로 이루어짐
    • mdm_d와 달리 msm_s는 RGB대신 gray-scale로 이루어진다

Ambient

  • 간접 조명을 설명하는 일반적인 수준의 조명
  • 다양한 오브젝트로부터 반사되는 빛들임
  • 물체에 부딪혀서 반사되면 같은 세기로 모든 방향으로 흩뿌려진다

Emissive

  • 물체 자체에서 나는 빛의 양

Phong model Lighting 최종 식

Per-pixel Lighting

Per-Vertex Lighting vs Per-pixel Lighting

  • Per-vertex lighting은 단순히 vertex의 color를 보간하기 때문에 퀄리티가 떨어짐

  • direcional light를 받는다고 가정
  • ll은 모든 표면에서 동일하다
    • constant buffer를 통해 constant vector로 Pixel shader에 제공된다
  • 반면에 n,r,vn, r, v는 물체 표면에 따라 다양함.
  • Pixel shader에 n,vn, v 한 쌍이 주어지고 그 다음 rr을 계산한다.
    • r=2n(nl)lr = 2n(n·l)-l

Normal for each pixel

  • ll이 world space 벡터이므로 nn도 world space 벡터여야 함.
  • rasterization stage에서 각 픽셀에 n을 제공하여 vertex normal이 보간된다
  • vertex shader는 각 vertex의 object space normal을 월드 변환하고, world space normal을 rasterization 단계로 전달함
    • 즉, object-space normal -> wolrd-space normal -> raterization
  • a,b에 n1, n2를 이용하야 보간하여 na,nbn_a, n_b를 할당한다(raterizer에서)

View vector for each pixel

  • a,b 는world-space의 view vector도 알아야 함(va,vbv_a, v_b)
  • vertex shader는 각 vertex의 object space 위치를 world space로 변환하고 해당 위치를 world space에 정의되어 있는 camera position(EYE)에 연결한다
  • rasterization 단계에서 va,vbv_a, v_bv1,v2v_1, v_2에 의해 보간당함

Pixel shader는 rasterizer로부터 각 픽셀별로 보간된 normal과 view vector를 받았다. ll은 constant buffer로부터 받고, 마침내 Phong model 구현 가능.

  • n,l,r,vn, l, r, v 모두 world space에서 정의됨

Blinn-Phong Reflection Model

Phong model을 수정한 버전임

  • 매우 효율적인 라이팅이지만 specular가 특정 조건에서는 비현실적으로 보임
  • (max(rv,0))shss(max(r·v, 0))^{sh}s_s x msm_s -> 90도 보다 커지면 0이 나옴 -> 순간적으로 cut되어 경계가 만들어짐(cosθ의 문제점)
    -> 그래서 이를 극복하기 위해 specular를 변경
  • reflection vector 대신 halfway vector 사용
  • h는 v, l의 중간인 벡터
  • (max(nh,0))shss(max(n·h, 0))^{sh}s_s x msm_s -> 최종식
profile
공부 노트

0개의 댓글