build lightmap system

98
Lightmap 시스템 구축하기 Ntreev Soft 황재식

Upload: jaesik-hwang

Post on 05-Jul-2015

570 views

Category:

Technology


1 download

DESCRIPTION

KGC 2008에서 발표한 라이트맵 구축하기 PT자료

TRANSCRIPT

Page 1: Build Lightmap system

Lightmap 시스템 구축하기

Ntreev Soft황재식

Page 2: Build Lightmap system

Agenda

• Lightmap 관련 기술 소개– Unwrapping 관련 기술 소개– Radiosity 관련 기술 소개

• 실제 게임 적용 사례 소개

Page 3: Build Lightmap system

Lightmap이란?

• 라이트 정보를 담고 있는 이미지

• Irradiance를 저장하고 있기 때문에Irradiance map이더 정확한 표현.

Page 4: Build Lightmap system

Quake2

Page 5: Build Lightmap system

Mirror’s Edge

Page 6: Build Lightmap system

Why?

Page 7: Build Lightmap system

패치(Patch)

• Lighting 계산을 위한 최소 단위

• 각각의 Patch는 Lightmap의 1픽셀에 대응

• 패치가 많을수록 보다 정교한 계산 가능– Lightmap 해상도가 커짐– 계산 시간이 더 오래 걸림

Page 8: Build Lightmap system

패치(Patch)

http://graphics.stanford.edu/courses/cs348b-00/lectures/lecture17/walk006.html

Page 9: Build Lightmap system

라이트맵 공정

Unwrapping Baking

Page 10: Build Lightmap system

알고리즘 소개

Unwrapping Baking

Page 11: Build Lightmap system

Unwrapping

• Segmentation• Mesh parameterization

Page 12: Build Lightmap system

Atlas, Chart

• Atlas ≥ Chart

Chart

Atlas

Page 13: Build Lightmap system

좋은 Unwrapping 조건

• 균일한 Patch 사이즈• 왜곡이 적어야 한다.

– 내각의 크기와 세 변의 길이 비율이 Unwrapping된 후에도 비슷하게 보존될수록 왜곡이 적다라고 할수 있다.

Large Chart Low Distortion

Page 14: Build Lightmap system

알고리즘 종류

• Iso-charts• LSCM• ABF++• D-charts• MCGIM• 기타 등등

Page 15: Build Lightmap system

Iso-charts

• 빠르고 효율적인 Chart 생성

• UVAtlas in DirectX9– D3DXUVAtlasCreate,

D3DXUVAtlasPartition, D3DXUVAtlasPack– uvatlas.exe

• Halo3에서의 라이트맵에서도 사용됨.

Page 16: Build Lightmap system

Iso-charts 과정

• 서피스 분포 분석• 스트레치 최적화• 서피스의 분포를 고려해서 묶는다.• 차트의 경계를 최적화한다.• 스트레치 기준을 충족 시킬 때까지 차트를 재귀

적으로 계속 나눈다.• 패킹을 해서 Atlas로 만든다.

Page 17: Build Lightmap system

알고리즘 소개

Unwrapping Baking

Page 18: Build Lightmap system

Baking

• Radiosity 알고리즘을 이용, Lightmap의 각각의 픽셀에 Irradiance를 계산해서 저장하는과정.

• 차례– Radiosity 소개– 용어 설명– Radiosity 알고리즘 소개

Page 19: Build Lightmap system

Radiosity

• Diffuse 머티리얼을 가지는서피스와 광원, 혹은 두Diffuse 서피스 사이의 빛의상호 작용을 계산하는 방식.

• Diffuse Material만 다루기때문에 카메라에 독립적이다.

• Direct Lighting과Indirect Lighting 계산

Page 20: Build Lightmap system

Direct Lighting

• 태양이나 전구 같이 직접빛을 내어 물체를 비추는광원에 대해서 계산을하는 것

• 장면에 가장 밝은 빛을제공하고 그림자를 생성한다.

Page 21: Build Lightmap system

Indirect Lighting

• 다른 오브젝트를 비추기전에 이미 반사되거나다른 표면에서 부딪혀서나온 빛을 계산한다.

• 장면의 구석구석을 밝히거나공간을 채우는 빛을 만든다.

• Color Bleeding 효과

Page 22: Build Lightmap system

용어설명

• Flux• Solid Angle• Radiance• Irradiance• Radiosity• Form Factor• Monte Carlo Method• Russian Roulette

Page 23: Build Lightmap system

• 단위 시간 동안 표면을 통과하는 총 에너지 량• 단위 : J/s, W(watt)• 보통 Φ 표현• 다른 말로

Radiant Power

Flux

Page 24: Build Lightmap system

입체각(Solid Angle)

• 단위 :steradian

Page 25: Build Lightmap system

Radiance

• 단위 면적, 단위 Solid Angle에 대한 Flux 량• L = d2Φ/(dwdA

ㅗ)= d2Φ /(dwdAcosΘ)

dA

dAㅗ

Page 26: Build Lightmap system

Irradiance

• 표면의 단위 면적에 들어오는 Flux 량전 방향으로 들어오는 모든 Radiance의 합

• 단위 : W/m2

• E = dΦ/dA (A:표면적)

Page 27: Build Lightmap system

Radiosity

• 표면의 단위 면적에서 나가는 Flux 량• 단위 : W/m2

• M = B = dΦ/dA (A:표면적)

Page 28: Build Lightmap system

Form Factor

• 한 패치에서 발산된 에너지 중 다른 패치에 도달한 에너지 비율

Page 29: Build Lightmap system

Form Factor

Self-emitted

radiosity

reflectivity total

radiosity

Form factor

Page 30: Build Lightmap system

Monte Carlo Method

• 통계 확률 이론에 기반을 둔 개념으로 난수를 발생시켜 원하는 값의 확률적 분포나 수치를 구하는 방법

• 예1) π 구하기

N = 전체 찍힌 점의 수Nc = 부채꼴 안의 점의 수A = 1(사각형 면적)Ac = π /4(부채꼴의 면적)Ac /A = π /4 =Nc /N

Π = 4Nc/N

Page 31: Build Lightmap system

Monte Carlo Method 예2

• 광원에서 발사되는 Ray나Photon의 발생 위치와 발사방향을 랜덤하게 결정하는데사용하거나 반사면에서 생존여부를 가릴 때 사용한다.

Page 32: Build Lightmap system

Monte Carlo Estimator

• Monte Carlo 방법을 이용해서 적분의 근사치를 구할 수 있다.

• 샘플링 개수(N)가 많을수록 실제 해에 가까워진다.

적분Estimator

Page 33: Build Lightmap system

Importance Sampling

• Monte Carlo Estimator을 구할 때 표본을 실제피적분 함수 모양에 가깝게 샘플링 하면 더 적은 수의 샘플링으로 실제 해에 가까운 값을 얻을 수 있다.

• 예1) 직접광에 의한 라이팅을 계산할 때 패치에서광원 방향으로 더 많은 Ray를 생성한다.

• 예2) 간접광에 의한 라이팅을 계산할 때 패치의 노멀과 가까운 방향으로 더 많은 Ray을 생성한다.

Page 34: Build Lightmap system

Russian Roulette

• Indirect Lighting 계산에서 Ray나 Photon을 몇번이나 반사시킬지 정할 수 있어야 한다.

– 반사 횟수로 제한– Power가 일정 수치 이하로 내려갈 경우 소멸

• 위 두 가지 방식은 장면 내의 전체 에너지를 보존시켜주지 못한다.

– 매번 반사될 때마다 Russian Roulette 이용• 에너지를 보존시켜준다.

Page 35: Build Lightmap system

Russian Roulette

• q에 의해서 살아남은 샘플에 가중치가 부여되어서총 에너지의 손실이 없는 결과를 얻을 수 있다.

• q에 의해서 Ray나 Photon의 Bounce 횟수를 조절할 수 있다.

Page 36: Build Lightmap system

Russian Roulette

// Possibly terminate every light pathif( nIntersections > 2 ){

float q = 0.5f;if( RandomFloat() > q )

break;irradiance /= q;

}

어두운 씬에서는 반사가 적게 이뤄져도 되기 때문에q를 크게 설정해서 반사가 적게 이뤄지도록 하고밝은 씬에서는 q를 크게 셋팅해서 많은 수의 반사가이뤄지도록 할 수 있다.

Page 37: Build Lightmap system

Radiosity 알고리즘 분류 - 1

Classic Radiosity

Monte Carlo MethodRay-tracing 방식Final GatheringPath-tracing 방식Stochastic Jacobi RadiosityIrradiance CachePhoton mappingInstant Radiosity

Scene Rendering

방식

Page 38: Build Lightmap system

Classic Radiosity

• 모든 패치 사이의 Form Factor를 미리 구해줘야 한다.• 많은 저장 공간이 필요하고 시간이 오래 걸리기 때문에 비효율적• n개의 패치가 있을 때 n2 * 0.5 번의 Form Factor 연산을 미리 해줘

야 한다.• 계산 도중 중간 결과를 보기 힘들다.

Page 39: Build Lightmap system

Monte Carlo Method

• Form Factor를 미리 구할 필요가 없다.

• Classic 방식에 비해서 더 적은 저장 공간과 짧은 계산 시간으로 괜찮은 퀄리티의 결과물을 얻을 수 있다.

• 중간에 결과를 확인해 볼 수 있다.

Page 40: Build Lightmap system

Scene Rendering 방식

• 패치에서 노멀 방향으로 보이는 씬을 렌더링 한 다음 렌더링 된 텍스쳐의 각각의 픽셀을 패치로 들어오는 Radiance로 간주하고 Irradiance를 구하는 방식.

• Ray-tracing 같은 복잡한 알고리즘을 알 필요가없고 별도로 Form Factor를 구하지 않아도 된다.

• 모든 패치를 광원으로 간주한다.

Page 41: Build Lightmap system

Scene Rendering 방식

1

23

4 5 6

Page 42: Build Lightmap system

Scene Rendering 방식

7 8 9

10 11

Page 43: Build Lightmap system

• Hemisphere map 대신Hemicube map사용

Scene Rendering 방식

Distance Map Lambert's Cosine Map

Page 44: Build Lightmap system

Radiosity 알고리즘 분류 - 2

Gathering

Scene Rendering

Ray-tracing 방식

Final Gathering

Path-tracing 방식

Shooting

Stochastic Jacobi

Radiosity

Photon Mapping

Instant Radiosity

속도개선

Irradiance

Cache

Page 45: Build Lightmap system

Shooting

• 한 패치에서 발산된 에너지에 영향을 받는 다른주변 패치의 에너지 상태를 업데이트 한다.

• 계산 결과를 빨리 볼 수 있지만 작은 패치에 대해서 노이즈 결함을 발생 시킨다.

Page 46: Build Lightmap system

Gathering

• 한 패치에서 보이는 다른 패치로부터 발산되는에너지를 모아서 패치의 에너지 상태를 업데이트한다.

• 노이즈 결함을 없애서 렌더링 퀄리티를 올리는데사용될 수 있다.

Page 47: Build Lightmap system

Ray-traced 방식

Gathering

Scene Rendering

Ray-tracing 방식

Final Gathering

Path-tracing 방식

Shooting

Stochastic Jacobi

Radiosity

Photon Mapping

Instant Radiosity

속도개선

Irradiance

Cache

Page 48: Build Lightmap system

Ray-tracing 방식

• Direct Lighting– 각각의 패치에서 광원을 향해 Ray을 발사, 1차

Lighting 정보를 생성한다.– 그림자 생성

• Indirect Lighting– Final Gathering 단계, 패치 주변으로 Ray을

발사해서 Radiance 정보를 수집한다.

Page 49: Build Lightmap system

directIllumination(x)estimateRadiance = 0;for all shadow rays{

generate point y on light sourceestimateRadiance += Le(y, yx) *

Reflectance * G(x,y) * V(x,y) / pdf(y);}extimateRadiance = estimateRadiance / #shadowRays;return(estimateRadiance)

V(x,y) : 패치 x에서 패치 y가 보이는지 여부G(x,y) =

Direct Lighting 의사코드

Page 50: Build Lightmap system

Direct Lighting

Page 51: Build Lightmap system

Final Gathering

Gathering

Scene Rendering

Ray-traced 방식

Final Gathering

Path-tracing 방식

Shooting

Stochastic Jacobi

Radiosity

Photon Mapping

Instant Radiosity

속도개선

Irradiance

Cache

Page 52: Build Lightmap system

Final Gathering

• 이미 계산된 Radiosity를Ray-tracing을 이용해서더 정확하고 부드러운 결과를만들어 냄.

• Indirect Lighting계산하기위해 사용되거나Shooting, Photon mapping계산 후 2pass에서 Rendering 퀄리티를 높이기 위해서 사용

Page 53: Build Lightmap system

• Hemisphere Sampling을이용, 패치에서 반구 방향으로무작위로 Ray 발사.

• 충돌된 가장 가까운 지점의Radiance을 가져온다.

• Importance Sampling을이용해서 패치의 노멀 방향에 가까운 방향의 Ray를 더많이 발사하면 더 적은 연산으로 동일한 결과를 얻을 수있다.

Sampling

Page 54: Build Lightmap system

Final Gathering 결과

Page 55: Build Lightmap system

Path-tracing 방식

Gathering

Scene Rendering

Ray-tracing 방식

Final Gathering

Path-tracing 방식

Shooting

Stochastic Jacobi

Radiosity

Photon Mapping

Instant Radiosity

속도개선

Irradiance

Cache

Page 56: Build Lightmap system

Path-tracing 방식

• 실질적으로 반사가 수행하는 Ray는하나만 생성하고 나머지 Ray는 주변의Radiance를 수집하는 역할만 한다.

• Ray-tracing 방식은 bounce될 때에도여러 개의 반사Ray가 생성된다.

• Path-tracing 방식은 Final Gathering을수행 한 후 간접광을 빠르게 한번 더계산할 때 주로 사용된다.한 방향으로만 브랜칭 되기 때문에Ray-Tracing 방식보다 속도는 빠르지만최종 렌더링 퀄리티는 떨어진다.

Page 57: Build Lightmap system

Stochastic Jacobi Radiosity

Gathering

Scene Rendering

Ray-traced 방식

Final Gathering

Path-tracing 방식

Shooting

Stochastic Jacobi

Radiosity

Photon mapping

Instant Radiosity

속도개선

Irradiance

Cache

Page 58: Build Lightmap system

Stochastic Jacobi Radiosity

• 처음pass에서는 광원에서 Ray를 발사해서주변 패치의 에너지 상태를 업데이트 시키고 이후 pass에서는 각각의 패치에서 반사되는 빛을 고려해서 주변패치의 에너지 상태를 업데이트 한다.

• 패치와 광원사이의 Form Factor는 광원에서 발사된전체 Ray수와 패치가 받은 Ray수의 비율로 나타낸다.

Fij = Nij/NiNi는 패치i 에서 발사된 Ray 수,

Nij는 패치 i에서 발사된 Ray중 패치 j에 도달한 Ray 수

Page 59: Build Lightmap system

Ray 생성

Local line – 1pass Global line – 2,3,4…pass

Page 60: Build Lightmap system

Stochastic Jacobi Radiosity

Page 61: Build Lightmap system

Irradiance Cache

Gathering

Scene Rendering

Ray-tracing 방식

Final Gathering

Path-tracing 방식

Shooting

Stochastic Jacobi

Radiosity

Photon Mapping

Instant Radiosity

속도개선

Irradiance

Cache

Page 62: Build Lightmap system

Irradiance Cache

• 인접한 패치의 Irradiance를 보간해서 Patch의 Irradiance를 구한다.

• Direct Lighting의 경우 패치사이의Irradiance 변화량이 큰 곳이 많이 존재하지만Indirect Lighting의 경우에는 상대적으로 인접한 패치끼리의 변화량이 적은 곳이 대부분이기때문에 이러한 보간 연산이 가능하다.

Page 63: Build Lightmap system

가중치 부여

• 보간에 참여하는 각각의 패치에 가중치를 부여한다.

• 거리가 작고 노멀 벡터의 내적과 주변 지오메트리와거리가 클수록 높은 가중치를 갖게 된다.

Page 64: Build Lightmap system

버림 조건

• 다음과 같은 조건을 갖는 인접한 패치는 무시된다.– 노멀 벡터의 차이가 너무 크다.– 주어진 패치보다 앞에 존재한다.

n

p

E(p,n)

p’

p p’

n E(p,n)

Page 65: Build Lightmap system

Irradiance 계산 - 1

• 패치 사이 변화가 큰 부분에서는 Irradiance를 직접계산하고 계산된 값을 Octree 구조를 갖는Irradiance Cache에 저장한다.

http://www.rorydriscoll.com/2009/01/18/irradiance-caching-part-1/

Page 66: Build Lightmap system

Irradiance 계산 - 2

• 변화량이 작은 부분에서는 Irradiance Cache를 이용, 주변의 패치를 검색 한 후 아래 식으로Irradiance를 보간한다. 이 결과 역시 Cache에 저장한다.

Page 67: Build Lightmap system

Photon Mapping

Gathering

Scene Rendering

Ray-tracing 방식

Final Gathering

Path-tracing 방식

Shooting

Stochastic Jacobi

Radiosity

Photon Mapping

Instant Radiosity

속도개선

Irradiance

Cache

Page 68: Build Lightmap system

Photon Mapping

• Two-Pass 알고리즘– 1Pass

• 광원에서 Photon 발산• 서피스와 충돌, 반사• 충돌된 Photon을 Photon map에 저장• 패치 별로 주어진 반경 안에 있는 Photon을 검색해서 Irradia

nce 계산(검색된 Photon의 Flux을 모두 더한 후 원의 면적으로 나눠준다.)

– 2Pass• Final Gathering

• 적은 비용으로 Caustic 효과를 낼 수 있다.

Page 69: Build Lightmap system

Photon Mapping• Photon : Flux 운반체• Photon map

– 서피스와 부딪힌 지점의 Photon 정보 저장– Balanced Kd-Tree– Global Photon Map(Direct, Indirect)– Caustic Photon Map

Page 70: Build Lightmap system

Photon State Machine

Direct

Caustic

Indirect

CausticEmission

Specular

Specular

Nonspecular

Nonspecular Specular/Nonspecular

Specular/Nonspecular

Page 71: Build Lightmap system

Photon Mapping 결과

Page 72: Build Lightmap system

Instant Radiosity

Gathering

Scene Rendering

Ray-tracing 방식

Final Gathering

Path-tracing 방식

Shooting

Stochastic Jacobi

Radiosity

Photon mapping

Instant Radiosity

속도개선

Irradiance

Cache

Page 73: Build Lightmap system

Instant Radiosity

• Direct, Indirect Lighting을Point 광원으로 표현한다.

• Diffuse로 이뤄진Scene에서만 가능하다.

• GPU Rendering을 이용해서구현 가능하다.(Keller’s Paper)

Page 74: Build Lightmap system

Instant Radiosity

Page 75: Build Lightmap system

개발 사례

• Unwrapping : UVAtlas• Baking : Beast

Page 76: Build Lightmap system

Unwrapping 차례

• UVAtlas 소개• UVAtlas 에서 사용되는 주요인자

– Stretch – Gutter Width– IMT

• Lightmap 압축• Instancing

Page 77: Build Lightmap system

UVAtlas 소개

• DirectX에서 제공하는 Iso-charts 알고리즘을이용한 UV Unwrapping API

• 용도– Normal/displacement mapping – Texture-space PRT simulations and light ma

ps – Surface painting – Texture-space lighting

Page 78: Build Lightmap system

UVAtlas 주요 인자

• Stretch

• Gutter Width

• Integrated Metric Tensors(IMT)

Page 79: Build Lightmap system

Stretch - 1

• Chart를 어느 정도로 펼 것인가?• 0~1 사이 값. 0.16667이 기본값.

0 0.1 0.1667 이상

Page 80: Build Lightmap system

Stretch – 2

CSG맵은 Stretch가 0에 가까울수록 결과가 좋았음

일반 Mesh로 이루어진 맵은0.16정도 했을 때 괜찮았음.

Page 81: Build Lightmap system

• Chart 사이 너비• Padding이라도고 함.• Multi Sampling시 인접한 Chart의 색을 침범하지 못하도록

하는 역할.

Gutter Width

2 30

Page 82: Build Lightmap system

Integrated Metric Tensors - 1

• Texture-space에서 삼각형을 어떻게 펼 것인지 정의• 픽셀의 색 변화량이 큰 부분에 더 많은 공간을 할당하는

것이 가능(Lightmap compression in halo3)

Page 83: Build Lightmap system

Integrated Metric Tensors - 2

• D3DX IMT 관련 함수를 이용해서 IMT 생성– D3DXComputeIMTFromPerVertexSignal– D3DXComputeIMTFromPerTexelSignal– D3DXComputeIMTFromSignal– D3DXComputeIMTFromTexture

• 유저가 임의로 생성한 IMT도 Chart를 생성할때 사용 가능함.

Page 84: Build Lightmap system

Lightmap 압축

Lightmap compression in Halo3

Page 85: Build Lightmap system

Lightmap 압축

Lightmap compression in Halo3

Page 86: Build Lightmap system

Mesh와 Instance

• Mesh는 Vertex, Face, Material 정보

• Instance는 Mesh ID와 Transform 정보를가지고 있음.

• 한 씬에 동일한 Mesh가 여러 개 존재할 때Instance로 관리하면 자원을 효율적으로 관리할 수 있음.

Page 87: Build Lightmap system

Instancing

• 동일한 Mesh가 여러 개 존재 할 때 오직 한 Mesh에 대해서만Chart를 만들고 다른 Instance는 이미 만들어진 Chart사용.

• Instance는 Lightmap에서의 UV 시작위치만 저장.

Page 88: Build Lightmap system

Baking 차례

• Radiosity 미들웨어 소개• Beast 소개• 렌더링 샘플• 퀄리티를 높이기 위한 팁• 동영상

Page 89: Build Lightmap system

Radiosity 미들웨어

• Beast

• Lightsprint

• Enlighten

• 기타 등등

Page 90: Build Lightmap system

Beast 소개

• Baking 전용 미들웨어

• Illuminate Labs에서 개발

• 대표작 : Mirror’s Edge

• Montel Carlo 방식에 기반한 렌더러– Final Gathering, Path tracing,

Photon mapping, Irradiance Cache 등을 지원

Page 91: Build Lightmap system

Direct Lighting

Page 92: Build Lightmap system

Indirect Lighting

Page 93: Build Lightmap system

Soft Shadow

Page 94: Build Lightmap system

Color Bleeding

Page 95: Build Lightmap system

퀄리티를 높이기 위한 간단한 팁

• 라이트맵 바탕색을전체 계산된 라이트맵차트의 색과 비슷하게하라.

• 계산이 끝난 후에차트의 Edge를1~2픽셀 정도바깥으로 늘려라.

Page 96: Build Lightmap system

Lightmap Baking 동영상

Page 97: Build Lightmap system

참고자료

• Advanced Global Illumination• Physically Based Rendering• Light map compression in halo3

Page 98: Build Lightmap system

Q&A

이메일 주소 : [email protected]

블로그 : emptymind.tistory.com