skybox_water_lensflare_bolt
MoonFlow™ 렌즈 플레어 시스템 (Lens Flare System)
이것은 카메라 앞에 위치한 쿼드 메시(quad meshes)를 사용하여 구현하는 렌즈 플레어(Lens flare) 렌더링 시스템입니다. 따라서 어떤 렌더 파이프라인에서도 사용될 수 있습니다.
이 시스템은 동시에 여러 개의 렌즈 플레어를 지원하며, 각 플레어 라인당 하나의 드로우 콜(draw call) 비용을 소모합니다.
QQ截图20200909014148
QQ截图20200909014225
0. SpriteEditor 버전 특수 설정 (SpriteEditor version special settings)
Slice 버전
이 에셋의 경우, 플레어 아틀라스(flare atlas)가 Sprite Editor를 통해 분리됩니다. 'Texture Type' 설정을 'Sprite(2D and UI)'로 변경하고, 'Sprite Mode'를 'Multiple'로 설정해야 합니다. 만약 프로젝트에 Sprite Editor를 설치했다면, 원할 때 적용(apply)을 누른 후 편집할 수 있습니다.
Cell 버전
이 버전에서는 사용자가 직접 슬라이스(slice) 할 필요가 없으며, 아틀라스는 스프라이트 슬라이서(sprite slicer)의 셀 모드처럼 자동으로 분리됩니다. 따라서 'Cell' 속성에서 각 축에 대한 수량을 설정해야 합니다.
1. 설정 (Setup)
유니티 패키지(unitypackage)를 컴퓨터로 다운로드합니다.
그런 다음 다음과 같은 파일들을 볼 수 있습니다:
2. 초기 에셋 생성 (Init Asset)
커서를 _project view_로 이동하여 마우스 오른쪽 버튼을 클릭하고 다음 옵션을 찾습니다:
Create -> MFLensflare -> Create MFFlareData split by SpriteEditor.
Create -> MFLensflare -> Create MFFlareData split by Cell.
그런 다음 에셋이 선택되었을 때 _Inspector view_에서 기본 설정을 볼 수 있습니다.
SpriteEditor 버전
Cell 버전
3. 에셋 설정 (Asset Settings)
플레어 에셋을 설정하기 위해 3가지 전역 속성(global properties)이 있습니다.
1) Texture
필요한 플레어 아틀라스를 선택합니다.
2) Fade With Scale
렌즈 플레어가 페이드 인(fading in)하거나 페이드 아웃(fading out)하는 동안 스프라이트 스케일(sprite scale)이 변경됩니다.
3) Fade With Alpha
렌즈 플레어가 페이드 인하거나 페이드 아웃하는 동안 스프라이트 알파(sprite Alpha)가 변경됩니다.
각 에셋 버전에 대한 특수 설정:
- Slicer 버전
스프라이트 아틀라스의 Texture Importer 설정에서, Texture Type 설정을 _Sprite(2D and UI)_로 설정해야 하며, _Sprite Mode_는 _Multiple_로 설정해야 합니다.
- Cell 버전
Cell(Vector2)라는 속성도 있습니다. 여기서 x는 아틀라스 상에 있는 단일 라인 플레어의 개수이고, y는 아틀라스 상에 있는 단일 컬럼 플레어의 개수입니다.
4. 새 플레어 추가
이것은 일렬로 배열된 스프라이트(sprites)를 기반으로 하는 렌즈 플레어입니다. 따라서 모든 스프라이트 조각을 플레어 에셋에 설정해야 합니다. 분리된 아틀라스 조각을 클릭하여 새로운 플레어 조각을 만드세요. 다음 설정들이 Inspector 보기에서 추가된 것을 확인할 수 있습니다.
BlockSettings
1) Index (인덱스)
이 솔루션은 인덱스를 설정하여 조각을 검색합니다. 스프라이트 아틀라스를 선택하지 않은 경우, 보드 위의 모든 블록의 인덱스를 찾을 수 있습니다. 이 옵션을 변경하여 사용할 조각을 전환할 수 있습니다.
2) Rotation (회전)
선택하는 경우, 이 조각은 뷰에서 움직이는 동안 광원(light source)과 함께 회전합니다.
3) LightColor (광색)
이것은 단일 플레어 색상의 강도로, 빛의 색상과 완전히 혼합되는지 여부를 의미합니다.
또한 플레어 런처가 _Use Light Intensity_를 체크한 경우, 최종 색상은 빛의 강도와도 혼합됩니다.
4) Offset (오프셋)
이것은 이 조각이 화면에 최종적으로 표시될 위치를 제어합니다.
값은 광원과 디스플레이 화면 중앙 사이의 거리를 기반으로 합니다.
value = -1: 이 조각은 광원과 일치합니다.
value = 0: 이 조각은 디스플레이 화면 중앙과 일치합니다.
5) Color (색상)
이 속성을 사용하여 색상을 덧씌워 이 조각의 결과(광원 색상과의 공존)를 변경할 수 있습니다.
6) Scale (크기)
이 속성을 기반으로 화면에 표시되는 조각입니다.
7) Remove (제거)
플레어 조각 목록에서 이 조각을 제거하려면 클릭하세요.
5. 광원에 플레어 런처 추가
게임 오브젝트에 MFFlareLauncher 컴포넌트를 추가합니다. 이것은 광원을 기반으로 하는 몇 가지 설정이 있으므로 Light 컴포넌트가 필요합니다.
이제 런처 설정을 볼 수 있습니다.
1) Directional Light (방향성 광원)
만약 광원(light source)이 방향성 광원(directional light)이라면 이 옵션을 활성화하고, 그렇지 않다면 비활성화합니다. 이 옵션은 광원에서 멀리 떨어져 있을 때 플레어(flare)가 사라질지 여부를 결정합니다.
2) 빛 강도 사용 (Use Light Intensity)
이 옵션을 활성화하면 빛의 강도가 해당 광원에 표시되는 플레어의 강도에 영향을 미칩니다.
3) 에셋 (Asset)
이 광원에서 사용할 플레어 에셋을 설정해야 하며, null일 수 없습니다.
6. 카메라에 플레어 렌더 추가하기 (Add flare render to your camera)
카메라에 MFLensFlare 컴포넌트를 추가하면 플레어 렌더 설정을 볼 수 있습니다.
1) 디버그 모드 (Debug Mode)
씬 뷰(scene view)에서 실제 플레어 위치와 카메라 사이에 선이 렌더링됩니다.
2) 머티리얼 (Material)
플레어를 렌더링할 머티리얼을 설정합니다. 주의: 이 셰이더가 현재 렌더 파이프라인에서 올바르게 렌더링될 수 있는지 확인해야 합니다.
렌즈 플레어(lens flare)를 렌더링하는 데 사용되는 셰이더는 다음 기능을 가지고 있어야 하며, 프로젝트에 _MFLensflare.shader_라는 예제 파일을 이미 만들어 두었습니다:
1. 깊이 맵 읽기 및 가림 결정 (Depth map reading and occlusion determination)
이 솔루션은 광원의 깊이를 깊이 맵(depth map)의 같은 픽셀 깊이와 비교하여 가림 여부를 결정할 수 있습니다. 따라서 C# 스크립트를 사용하여 화면 공간(screen space)의 광원 위치를 셰이더로 입력해야 하며, 이 화면 위치를 UV로 사용하여 깊이 텍스처를 읽고 광원이 가려졌는지 아닌지를 찾아야 합니다.
2. 정점 색상 혼합 (Vertex color mixing)
이 솔루션은 각 플레어 에셋의 색상 설정을 각 메시(mesh)의 정점 색상(vertex color)을 변경하여 렌더링합니다. 이는 파티클 시스템(Particle System)에서 하는 것과 매우 유사합니다. 따라서 셰이더는 최종 프래그먼트 결과 출력 직전에 정점 색상을 혼합해야 합니다.
3. Queue > 3000 && Blend One One
쉽게 이해할 수 있습니다. 렌즈 플레어는 색상을 대체하지 않습니다. 또한 어느 정도의 투명 픽셀도 렌더링되어야 합니다.
4. _MainTex
코드 _MFLensflare.cs_의 경우, 선택된 플레어 아틀라스는 _MaterialPropertyBlock_을 사용하여 설정하며, 저는 속성 이름을 "_MainTex"로 설정했습니다. 그러면 시스템이 서로 다른 광원 사이에서 아틀라스를 변경할 수 있습니다. 이 속성 이름은 변경할 수 있지만, MFLensflare.cs와 셰이더 양쪽 모두에서 같은지 확인해야 합니다.
3) 페이드 아웃 시간 (Fade out time)
광원이 화면에서 사라진 후 플레어가 사라지는 데 걸리는 시간을 보여줍니다.
프로젝트의 사용자 지정 설정 (매우 중요!!!!)
- MFLensflare.cs 맨 앞에서, 광원이 뷰에 있지만 더 가까운 물체로 가려졌을 때 웨이크업 페이드아웃 기능에 필요한 설정을 볼 수 있습니다.
- PIPELINE_DEPTH_TEX
프로젝트에서 사용되는 깊이(depth) 텍스처의 이름입니다. 올바른 깊이 텍스처를 찾는 데 사용됩니다.
- Z_BUFFER_PARAMS
프로젝트에 정의된 현재 ZBufferParams입니다. 자세한 내용은 unity 공식 문서를 찾아보시기 바랍니다.
- CAMERA_COMPARE_TAG
프로젝트에서 3D 장면을 렌더링하는 데 사용되는 카메라의 독점(proprietary) 태그입니다. 가려짐(occlusion)을 계산하기 위해 올바른 시간에 컴퓨트 셰이더를 실행하는 데 사용됩니다.
기타 최적화 항목 또는 질문
- Cinemachine을 사용하는 경우 부정확한(지연된) 변위 동기화 (displacement sync)
실행 순서(execution order)를 수동으로 설정해야 합니다. MFLensflare가 같은 틱(tick)에서 cinemachine brain보다 나중에 실행되도록 하십시오. 더 많은 도움은 다음을 참고하십시오: Execution order problem with assets (rainyrizzle.github.io)
- 너무 많은 드로우콜(drawcall)을 사용하는 여러 광원
이 솔루션은 서로 다른 광원 간에 다른 아틀라스를 사용할 수 있게 해주므로, 각 광원은 플레어 메시를 그리는 데 하나의 드로우콜이 필요합니다. 하지만 모든 플레어가 동일한 아틀라스에서 온 경우 이론적으로는 단 한 번만 렌더링될 수도 있습니다 (단일 드로우콜 사용).
- 방향성 광원(directional light)에만 사용됨
카메라에 _MFLensflareSimple_를 추가하기만 하면 됩니다. 이 기능은 런처(launcher)와 매니저(manager)의 기능을 모두 혼합했습니다.