9. 우리가 원했던 것
배경 제작 프로세스 효율화
라이트맵 UV 안 펼 수 없나.
라이팅 빌드 시간이 아까워.
퀄리티
배경과 캐릭터/수목의 일관된 느낌을 주고 싶다.
시간 날씨 변화
캐릭터를 좀 더 예쁘게 하고 싶다.
라이팅이 다르면 다른 장소같은 느낌
10. Try #1 : Clipmap SH Irradiance Volume
3D Clipmap 에 SH Irradiance Volume 을 저장해 보면 어떨까?
CPU Octree SH + GPU 3d clip map : 월드가 큰 경우 CPU 부하
GPU Octree SH + GPU 3d clip map : 해볼만하지만 우리 게임에는 불필요
11. Try #2 : Tiled Diffuse Probe Blending
UE4 reflection capture cubemap 에서 3rd order SH 를 Projection
UE4
Diffuse(추가)
12. SH Projection
GPU 에서 SH Projection : 실시간 에디팅 가능
UE4 의 SkyLight Diffuse SH Projection 기능을 이용
3rd Order Spherical Harmonics(9 float / channel)
13. Rendering
Compute Shader tiled culling
Reflection environment 에서 컬링
Interpolation 방식 변경
(PrecomputedLightVolume 방식)
Probe 별 Artist 컨트롤
(Color Tint, Intensity, Lighting Channel)
16. Probe Occlusion
Light leak?
Depth cubemap 기반 visibility
현재 :Probe 를 아티스트가 잘 배치(스피어, 박스)
2017 Nvidia GDC 발표
Probe 별로 Depth cubemap 과 VSM으로
Irradiance Probe 의 Occlusion 적용
계획:
17. Editor Tool
대낮 분위기 레벨
밤 축제 분위기
고요한 달밤 분위기
전환(시간)
전환
동굴밖(PPVolume)
동굴안(PPVolume)
전환( UE4규칙)
축축한 동굴 분위기
ULevel
PostProcessVolume
PostProcessVolume
ULevel
ULevel
24. Voxel based Volumetric Fog
Assasin creed 4 에 처음쓰임
Full Dynamic
Screen Aligened Voxel
Compute Shader Scattering
여러 개의 라이트 처리 가능
25. Shadow on Volumetric fog
In-Scatterred Voxel
불투명 재질은 PostProcess 에서 적용
반투명 재질은 Volume Texture 참조(Screen Aligned)
CSM ESM
ESM Shadow Projection
ESM
Sun Light
Down sample & Blur
In-Scatterred Voxel
In-Scatterred Voxel CS Loop per voxel
2D Compute ShaderIn-Scatterred Voxel Out-Scattered Voxel
26. Voxel based Volumetric Fog
Solving Scattering equation(시선 ray(pixel 1 개당 CS Thread 1개)
2D compute shader [numthreads(4, 5, 1)
DispatchComputeShader(Width/4, Height/5, 1)
Z 축을 따라서 Loop
27. Aliasing 줄이기(그림자)
Exponential Shadow Map
태양광에 그림자 적용할 때 Aliasing
줄여줌
Shadow map 을 미리 필터링해서
soft shadow 가능
6144x2048 CSM 768x256 ESM(Gaussian blurred)
35. Reference
https://mynameismjp.wordpress.com/2016/10/09/new-blog-series-lightmap-baking-and-spherical-gaussians/
Spherical harmonics 관련 읽을 거리
HBAO+ Ultra 엔비디아 발표자료
Volumetric fog 발표자료
Spherical Gaussian 라이트맵
http://silviojemma.com/public/papers/lighting/spherical-harmonic-lighting.pdf
http://www.ppsloan.org/publications/StupidSH36.pdf
https://cseweb.ucsd.edu/~ravir/papers/envmap/envmap.pdf
https://bartwronski.files.wordpress.com/2014/08/bwronski_volumetric_fog_siggraph2014.pdf
http://developer.download.nvidia.com/gameworks/events/GDC2016/atatarinov_alpanteleev_advanced_ao.pdf
36. 노크팀에서는 전 분야에 걸쳐 함께 할
개발자를 모집 중입니다.
많은 관심 및 지원 부탁 드립니다.
Editor's Notes
굽는 시간이 오래 걸린다. 렌더팜이나 프리뷰 퀄리티로 이터레이션하는 식으로 해결
동적인 오브젝트는 이레디언스 볼륨등의 보조수단이 필요
라이트맵 해상도를 늘리거나 맵이 넓으면 메모리도 문제(랜드스케잎 같은 경우)
디퓨즈 이레디언스나 sh 가 블렌딩 되므로 라이트맵 uv 가 연속적이지 않으면 라이팅 seam 이 보이게 되는데, 이거 펴는게 배경 만들 때 상당히 부하
움직이는 게 아니더라도 수풀이나 나뭇잎 (철망) 같은 복잡한 지오메트리는 퀄리티도 안나오고 라이트맵 해상도도 엄청 높여야 해서 쓸 수 없어서 보조수단으로 넘어간다.
스페큘러 표현이 안되서 큐브맵이 어차피 광범위하게 쓰여야 함
LPV 는 Sh Irradiance 볼륨을 실시간으로 만들어 내는 느낌?
Voxel Contrace 는 월드의 Direct Lighting 을 Voxelize 한 후에 Contracing (ray 를 적게 사용하는 일종의 실시간 레이트레이스)
인라이튼은 라이트맵을 실시간으로 만들어 냄(Specular 안되고, 애셋 제작측면에서의 라이트맵의 단점을 거의 그대로 가지고 있음)
가장 큰 동기는 배경 제작 프로세스를 효율화 하고 캐릭터와 배경을 동일한 느낌으로 렌더링하고자 하는 것.
UE4 의 precoputed lighting volume으로 캐릭터를 렌더링하는 것이 퀄리티가 떨어지는 것도 원인.2nd order sh, 지금은 3rd order sh)
한 장소에서의 시간 변화 혹은 분위기 전환도 덤으로 하고 싶다.
간접광을 블렌딩하기 위해서, SH irradiance volume 을 프리 베이크 한후,
Gpu clip 맵에 올린 후 블렌딩하는 것을 시도
전체 라이팅 샘플 데이터는 CPU Octree에 두고, 카메라 이동시에 GPU 클립맵을 업데이트
작동은 했지만, GPU Octree 에 전체 라이팅 샘플 데이터가 있는게 아니면 cpu octree 서치가 느려 포기.
나중에 GPU Octree 에 전체 볼륨 데이터를 두고, 렌더링은 클립맵에 두는 방식 만들어 보고 싶음.
언리얼에는 gpu 에서 pbr specular 를 위한 프리필터 큐브맵을 렌더링하고, diffuse irradiance sh 를 프로젝션하는 코드가 있다.
리플렉션 캡쳐를 움직이거나 업데이트 하면 프리필터 큐브맵을 실시간으로 생성하는 데 이때 diffuse sh 도 생성
ReflectionEnvironment 의 Tiled 렌더링에서 추가로 Diffuse SH 라이팅 추가,
프로브의 오버드로우만 높지 않다면 퍼포먼스 나쁘지 않음
언리얼에는 gpu 에서 pbr specular 를 위한 프리필터 큐브맵을 렌더링하고, diffuse irradiance sh 를 프로젝션하는 코드가 있다.
리플렉션 캡쳐를 움직이거나 업데이트 하면 프리필터 큐브맵을 실시간으로 생성하는 데 이때 diffuse sh 도 생성
ReflectionEnvironment 의 Tiled 렌더링에서 추가로 Diffuse SH 라이팅 추가,
프로브의 오버드로우만 높지 않다면 퍼포먼스 나쁘지 않음
프로브의 오버드로우만 높지 않다면 퍼포먼스 나쁘지 않음
언리얼에는 gpu 에서 pbr specular 를 위한 프리필터 큐브맵을 렌더링하고, diffuse irradiance sh 를 프로젝션하는 코드가 있다.
리플렉션 캡쳐를 움직이거나 업데이트 하면 프리필터 큐브맵을 실시간으로 생성하는 데 이때 diffuse sh 도 생성
ReflectionEnvironment 의 Tiled 렌더링에서 추가로 Diffuse SH 라이팅 추가,
프로브의 오버드로우만 높지 않다면 퍼포먼스 나쁘지 않음
언리얼에는 gpu 에서 pbr specular 를 위한 프리필터 큐브맵을 렌더링하고, diffuse irradiance sh 를 프로젝션하는 코드가 있다.
리플렉션 캡쳐를 움직이거나 업데이트 하면 프리필터 큐브맵을 실시간으로 생성하는 데 이때 diffuse sh 도 생성
ReflectionEnvironment 의 Tiled 렌더링에서 추가로 Diffuse SH 라이팅 추가,
프로브의 오버드로우만 높지 않다면 퍼포먼스 나쁘지 않음
시간, 혹은 지역이동에 따라 변화하는 라이팅을 아티스트가 직관적으로 제작하도록 하기 위해서,
하나의 분위기 혹은 시간을 UE4 레벨에 담도록 했음
이 레벨들을 특정 지역을 표현하는 피피 보륨에 연결시켜서, 레벨간 전환이 가능하도록 했음
볼륨을 이동하면 언리얼 피피볼륨 블렌딩 규칙과 동일하게 지역간 라이팅 블렌딩도 함.
시간, 혹은 지역이동에 따라 변화하는 라이팅을 아티스트가 직관적으로 제작하도록 하기 위해서,
하나의 분위기 혹은 시간을 UE4 레벨에 담도록 했음
이 레벨들을 특정 지역을 표현하는 피피 보륨에 연결시켜서, 레벨간 전환이 가능하도록 했음
볼륨을 이동하면 언리얼 피피볼륨 블렌딩 규칙과 동일하게 지역간 라이팅 블렌딩도 함.
시간, 혹은 지역이동에 따라 변화하는 라이팅을 아티스트가 직관적으로 제작하도록 하기 위해서,
하나의 분위기 혹은 시간을 UE4 레벨에 담도록 했음
이 레벨들을 특정 지역을 표현하는 피피 보륨에 연결시켜서, 레벨간 전환이 가능하도록 했음
볼륨을 이동하면 언리얼 피피볼륨 블렌딩 규칙과 동일하게 지역간 라이팅 블렌딩도 함.
스크린 스페이스에서 raymarching 해서 가려짐을 판단,
풀해상도인 경우 성능 낮고 라이트 여러개를 처리하기 어려움
그래서 고려하지 않음
대기보다는 안개를 처리하는 것이 목적,
간단한 Phase function 사용.
컴퓨트 쉐이더 사용
화면에 정렬된 복셀을 기반으로 한 테크닉이어서, 여러개의 라이트 사용이 가능하고, 포워드 shading 에서도 볼륨 텍스쳐 한번으로 깔끔하게 반투명 처리가 가능.
먼저 태양광에 대한 그림자 맵을 ESM 으로 변환 한다음에,
크기를 줄이고, 가우시안 블러를 먹인 Exponential shadow map으로 변환한다.
ESM 과 태양광 라이트 정보를 이용해 복셀에 입자 하나하나의 In-Scatter 라이팅을 인젝션한다.
복셀별로 루프를 돌려서 포인트라이트/스팟라이트의 In-scatter 라이팅을 인젝션한다.
시선 방향으로 2D compute shader 를 돌려서 (z 방향 픽셀 개수만큼 루프돌림) Out-scatter 계산(각 각의 복셀의 In-scatter 라이팅을 거리에 따른 감쇄를 적용해서 더함)
복셀의 xy 픽셀 하나당 컴퓨트 쉐이더 쓰레드 1개를 돌림
시선을 따라서 감쇄시키면서 쭉 더하는 것.
익스포넨셜 쉐도우맵은 d 와 z 의 차이값에 따라 그림자의 농도를 블러시켜주는 VSM 과 비슷한 테크닉,
사용되는 볼륨 텍스쳐의 해상도가 저해상도이기 때문에 생기는 그림자의 알리아싱을 줄여주기 위한 목적으로 사용함.
밝은 대낮에 캐릭터의 그림자가 없다면 캐릭터의 공간상의 위치를 인지하는데 어려움이 있고, 매우 부자연스럽게 보인다.
AO 는 환경광에 대한 그림자라 볼 수 있으므로 , 같은 맥락에서, AO 가 없으면 환경광이 제대로 계산되어 있더라도 부자연스럽게 보인다.
라이트맵이나 여타 다른 베이킹 방식에서는 AO 를 같이 계산해서 구워내지만 그렇게 하지 않고 있으니까, SSAO 같은 실시간 방식에 의존해야 되는데…..
찾아보니까, 배경과 캐릭터에 다른 AO 를 렌더링하는테크닉이 있었다.
배경은 넓고 진한 AO,
캐릭터는 좀더 세밀하고 조금 연한 AO,
캐릭터가 벽 근처에 서 있을 때의 아티팩트 제거
DFAO 도 좀 테스트 해봤으나, voxe Cone tracing 이 생각보다 느려서 포기함.
찾아보니까, 배경과 캐릭터에 다른 AO 를 렌더링하는테크닉이 있었다.
배경은 넓고 진한 AO,
캐릭터는 좀더 세밀하고 조금 연한 AO,
캐릭터가 벽 근처에 서 있을 때의 아티팩트 제거
DFAO 도 좀 테스트 해봤으나, voxe Cone tracing 이 생각보다 느려서 포기함.
기본적인 아이디어는 스텐실을 이용해서 배경과 캐릭터를 분리하는 것.
먼저 배경만 렌더링된 뎁스버퍼와 노말버퍼를 이용해 AO 버퍼에 AO 를 렌더링
그다음에 캐릭터를 다른 스텐실 빗 셋팅하고 뎁스와 노말 버퍼에 렌더링(그래서 베이스페스에서 함)
(Hbao+ ultra 사용시에는 캐릭터는 뎁스 프리패스 안함)
그다음 hbao 라이브러리 내부에서 다 알아서 해줌,
캐릭터 AO 를 overwrite 로 ao 버퍼에 렌더링
배경 AO 를 Min Blend 로 AO 버퍼에 렌더링(캐릭터 발근처 그림자 같은 걸 위해)
(엄밀히 말하면 전체가 3 패스이지만 총 픽셀 쉐이더 비용은 2 패스)