[Unity]/[게임 엔진]

[게임 엔진] 1. 렌더링 엔진(2) - 조명

극꼼 2023. 10. 30. 21:27
반응형

 


1. 지역 조명과 전역 조명 모델

지역 조명 모델 : 한 물체에 대한 지역적인 빛의 효과만 고려하고, 서로의 외관에 영향을 주지 않습니다.

  • 퐁 조명 모델 : 게임 렌더링 엔진이 가장 흔히 사용하는 지역 조명 모델로, 표면에서 반사되는 빛을 환경 + 난반사 + 정반사(+발산광(물체 스스로 내는 빛))의 합으로 표현합니다.
  • 블린-퐁 모델 : 퐁 모델을 확장한 모델로, 속도가 더 빠르지만 정확도가 조금 떨어지는 단점이 있습니다.

 

전역 조명 모델 : 간접 조명을 고려하는 조명 모델로, 특정한 시각 현상을 흉내내는 데 목적이 있습니다. 

  • 간접 조명 : 여러 표면에 여러 번 반사해서 최종적으로 가상 카메라에 도달

 

2. 광원 모델링

  • 정적 조명
    • 조명 맵 : 픽셀 단위의 조명을 미리 계산한 후 텍스처 맵에 저장합니다. 조명 맵을 물체에 투영해 조명 효과를 냅니다.
      난반사 텍스처 맵, 조명 맵을 합치지 않고 따로 쓰는 이유에는 다음과 같이 있습니다.
      • 난반사 텍스처 맵은 타일처럼 쪼개져서 씬의 여러 곳에 반복적으로 사용됨.
      • 조명 맵과 난반사 텍스처 맵에 다른 해상도를 사용할 수 있음.
      • 조명 정보만 들고 있는 조명 맵이 난반사를 포함하는 것보다 압축률이 더 좋음.
  • 환경 광 광원 : 퐁 조명 모델의 환경 광 항. 시선(카메라) 방향에 영향을 받지 않습니다. 색 하나로 나타냅니다.
  • 방향 광원 : 무한히 먼 저기에서 빛을 내는 광원으로, 평행합니다.
  • 점 광원 : 위치가 있고, 모든 방향에서 균등한 빛을 냅니다. 빛의 강도는 광원으로부터의 거리의 제곱에 반비례해서 줄어들고, 최대 범위를 벗어나면 0이 됩니다.
  • 스팟 광원 : 빛의 범위가 원뿔 모양으로, 안쪽 범위, 바깥 범위를 나타내는 원뿔 2개 사용합니다.
  • 면적 광원 : 한 점이 아닌 면적에서 나오는 광원으로, 그림자에 완전히 어두운 부분과 완전히 어둡지 않은 부분이 생깁니다. CG엔지니어들은 면적 광원을 직접 모델링하는 대신에 그림자를 여러개 만들어 블렌딩하거나, 그림자의 경계를 둔하게 만듭니다.
  • 발광체 : 표면 자체가 빛을 내는 광원입니다. 발광 텍스처 맵으로 모델링합니다.

 

3. 고급 조명 기법

  • 이미지 기반 조명
    • 법선 매핑 : 각 텍셀의 표면 법선 방향을 나타내는 벡터를 저장합니다. 법선 벡터는 대부분 텍스처의 RGB 채널에 담기며, RGB 채널의 범위는 0~1인데 정규화된 법선 멕터의 범위는 -1~1이므로 보정하는 작업이 필요합니다. . 낮은 테셀레이션 레벨로도 표면의 모양에 대한 정교한 정보를 렌더링 엔진에 줄 수 있습니다.
    • 높이 맵 : 특정 기준치에 대한 삼각현 표면의 높낮이를 인코딩합니다.
      다음은 높이 맵을 사용하는 기법 3가지입니다.
      • 범프 매핑 : 높이 맵을 통해 값싸게 표면 법선을 구현. → 근데 요즘엔 표면 법선을 높이 맵에서 계산하기보다는 별도의 법선 맵에 계산함.
      • 시차 차폐 매핑 : 평평한 표면의 텍스처 좌표를 높이맵 정보를 통해 인위적으로 조정.
      • 변위 매핑 : 테셀레이션을 통해 실제 표면을 세밀하게 나눠서 추가 정점을 생성하는데, 여기서 높이 맵 정보를 통해 각 정점의 변화 값을 정함. 실제 기하 형상이 생기는 것이기 때문에 자체 차폐(가림 효과), 자체 그림자 처리가 제대로 됨.
    • 정반사 맵 : 카메라, 광원, 표면 법선이 이루는 각도에 영향을 받으며, 정교한 정반사를 저장하고자 할 때 사용합니다.
    • 환경 매핑 : 물체를 둘러싼 전반적인 조명 환경을 나타냅니다. 가장 널리 쓰이는 것은 구형 환경 맵과 큐브 환경 맵입니다.
      • 구형 : 구면 좌표를 가지고 매핑합니다. 수직 각도가 천정에 가까워지면 수평 방향 정확도가 텍셀 하나에 제한됩니다.
      • 큐브 : 위의 단점 해결의 위해 고안되었습니다. 물체 표면의 한 점 P에 대한 텍셀 = 카메라에서 시작해 P로 향하는 광성을 구한 후 P의 표면 법선에 반사시키고 정육면체랑 만날때까지 직진합니다.
  • HDR 조명 (High Dynamic Range) : 넓은 범위의 빛 강도를 표현하려는 의도로 고안되었습니다. 조명을 계산할 때 임의의 값으로 자르지 않고, 강도가 1을 넘는(프레임 버퍼의 색 채널들은 0~1로 범위를 제한함) 것도 저장 가능합니다.
    • 색조 매핑 : 이미지의 강도 범위를 디스플레이 장치가 허용하는 범위로 이동하고 스케일합니다.
    • HDR 이미지 표현을 위해 R, G, B 채널을 8비트가 아닌 32비트 부동소수로 저장하거나 다른 색 모델 사용합니다.
      • Log2L * U * V = 많이 쓰이는 모델.
        • 명도 채널 = L (16비트)
        • 색도 채널 = U, V (각각 8비트)
  • 전역 조명 : 광원에서 나온 빛이 가상 카메라에 도달하는 과정에서 수많은 물체와 상호작용하는 조명 알고리즘입니다.
    • 그림자 렌더링
      • 반암부 : 그림자의 경계가 흐릿한 것으로. 물체의 표면을 여러 각도에서 비추기 때문입니다.
      • 가장 널리 쓰이는 그림자 렌더링 기법으로는 그림자 볼륨, 그림자 맵이 있습니다.
        • 그림자 볼륨 : 그림자를 지게 하는 물체들의 외곽선 모서리를 구하고, 이 모서리들을 광원에서 나오는 빛의 방향으로 밀어냄 = 빛이 가려지는 공간. 스텐실 버퍼라는 특수한 풀 스크린 버퍼를 사용. 스크린의 픽셀마다 하나의 정수 값을 저장하는데, 렌더링할 때 스텐실 버퍼 내용을 보고 마스킹함. 그림자 렌더링 : 씬을 그림자없이 프레임 버퍼를 그림(z-버퍼를 함께 그림) → 스텐실 버퍼를 초기화 → 앞을 향하는 삼각형들의 스텐실 버퍼 값을 1 증가시키고, 뒤를 향하면 1 감소시킴 → 그림자를 렌더링할 때 0이 아닌 부분을 검게 함
        • 그림자 맵 : 광원의 시점에서 수행하는 단편 단위 깊이 테스트. 광원의 시점에서 장면을 렌더링한 후 깊이 버퍼의 내용을 따로 저장한 그림자 맵 텍스처를 만듦 → 장면을 렌더링하고, 그림자 맵을 사용해 각 단편이 그림자 안에 들어가는지 판별 모든 삼각형의 정점은 광원 공간에서의 위치를 가지고 있고, 이 좌표를 그림자 맵의 텍스처 좌표 (u, v)로 변환 → 광원 공간 z 좌표를 맵에 저장된 깊이 정보와 비교해서 단편의 색을 조정(그림자 지는지 아닌지)
    • 환경 광 차폐 : 환경 광에 의해서만 장면을 조명할 때 생기는 약한 그림자(contact shadow)를 모델링하는 기법. 표면의 각 지점에 전체 빛이 얼마나 도달할 수 있는지를 나타냄. 표면의 한 점을 중심으로 반구를 만들고, 그 점에서 봤을 때 반구가 얼마나 보이는지의 비율로 그림자를 만듦.
    • 반사
      • 반짝이는 물체에 반사 ⇒ 환경맵 사용
      • 거울에 반사 ⇒ 카메라의 위치를 반사 표면에 대칭시키고 텍스처에 렌더링
    • 초곡면 효과 : 물, 광택있는 금속에서 발생하는 강렬한 반사 또는 산란.
    • 표면하 산란 : 빛이 표면의 한점으로 들어가면 표면 아래에서 산란한 후 다른 지점에서 밖으로 나옴. 피부, 밀랍, 대리석 등 따스한 질감 표현.
      • 깊이 맵 기반 : 광선이 빛을 가리는 물체를 뚫고 지나가는 데 필요한 거리를 측정하는 데에 그림자맵을 사용
    • PRT(Precomputed Radiance Transfer) : radiosity 기반 렌더링 방식을 실시간으로 시뮬레이션. 입사광이 표면에 어떻게 작용하는지 모든 방향에서 미리 계산하고 저장 ⇒ 런타임에 특정 입사광선이 대응하는 값을 찾아 빠르게 조명 결과로 변환.

 

4. 지연 렌더링

  • 삼각형 레스터화 기반 렌더링 : 모든 조명과 셰이징 계산을 뷰 공간의 삼각형 단편들로 함.
    • 단점
      • 연산을 해놓고 삼각형이 z-테스트를 통과하지 못해 버려짐 = 필요없는 연산
      • 다수의 광원을 처리하기 위해 수많은 정점 셰이더와 픽셀 셰이더가 다른 버전으로 난무
  • 지연 렌더링 : 대부분의 조명 계산을 스크린 공간에서 수행.
    • 조명을 고려하지 않고 장면을 그림 → G-버퍼라는 프레임 버퍼에 픽셀 조명에 필요한 정보 저장 → 장면을 완전히 렌더링한 후 G-버퍼를 사용해 조명과 셰이딩 계산.
    • G-버퍼 : 조명과 물체들의 표면 속성 정보를 각 픽셀마다 담고 있는 프레임 버퍼.

출처 도서 : http://acornpub.co.kr/book/game-engine-architecture-3e

반응형