RimLight를 적용하니 캐릭터에 역광이 생기는 것이 아닌 색을 덧칠하게 되는 버그가 발생했습니다.
튜터님의 프로젝트를 열기 위해 unreal 5.7 버전을 다운받고 비교를 한 끝에 Material Fuction의 Input 우선순위가 제대로 설정되어 있지 않았고,
이를 제대로 확인하지 않은 채로 노드를 연결해 DepthOffset과 bias가 바뀌어 들어가 문제가 발생한 것이 라는 것을 알 수 있었습니다.
Material Function Input 우선순위 지정

수정된 RimLight Depth

오류 발생 당시 사진(바꿔끼어 넣고 찍기)

해결 후

실시간 라이팅이 이루어지는 과정
라이팅에서 다 중요하지만 환경광의 영향은 상당히 높습니다.
전반적인 분위기를 연출하는 것은 환경광에서 오게 됩니다.
고전적인 게임 시스템에서는 환경광이 다음과 같이 구성되었다고 합니다.
L = saturate(Diffuse+Specular+Ambient)+Emissive;
Diffuse+Specular+Ambient 로 합한 값을 saturate로 0~1로 제한한 뒤 +Emissive를 해줍니다.
Ambient Light의 경우 복잡한 연산은 비용 문제로 사용할 수 없어 단순히 계산했다고 합니다.
Ambient = V * albedo
요즘은 환경광을 직접조명과 간접조명으로 나누어 효과를 구현합니다.
직접조명(DirectionalLighting)
광원에서에서 직접적으로 나오는 빛입니다.
광원에서 바로 픽셀로 도달하는 빛
간접조명(Indirect Lighting)
씬을 여러번 튕기며 들어오는 빛(반사, 확산)입니다.
다른 표면에 한번 이상 반사/확산된 뒤 들어오는 빛
Diffuse(난반사)
반사 대상의 BaseColor에 영향을 크게 받습니다.
물체가 빛을 흡수하고 남는 빛을 반사하는 것을 생각하면 됩니다.
Metalic과 반비례합니다.
Specular(정반사)
Unreal의 조명에는 Directional, Spot, Point, Rect, Emissiv가 존재합니다.
DirectionalLight가 여러 개 있으면 오류 메세지가 나옵니다. DirectionalLight는 태양과 같은 역할을 하기 때문에 가장 먼저 처리가 되는데 DirectionalLight가 여러개 있으면 어떤 것 먼저 처리를 해주어야 할 지 엔진이 알 수가 없어서 충돌이 발생할 수 있습니다.
DirectionalLight의 디테일에서 포워드 세이딩 우선순위를 지정해주면 해당 메세지를 없앨 수 있습니다.
복수의 DirectionalLight를 사용하는 것은 일반적으로 추천되지 않습니다. 필요한 경우가 있기는 한 것 같습니다.
3.소스 각도라는 속성의 값을 변경하면 그림자가 쨍해지거나 부드러워집니다. Specular 연산에 영향을 줍니다.
원형으로 비추는 조명입니다.
무대 조명 처럼 원뿔처럼 퍼지는 조명을 생각하면 됩니다.
빛의 구체를 생각하면 됩니다.
특정영역을 사각형으로 비춰주는 라이트입니다.
간판이나 형광등을 생각하면 됩니다.
연산 비용이 제일 높습니다.
라이팅 채널이라는 것이 존재합니다. 해당 채널을 통해 지정된 채널들에 해당하는 액터에게만 효과를 적용할 수 있습니다.
특정 영역에만 빛을 주는 조명(Point, Spot, React 등)을 로컬 라이트라 부른다고 합니다.
빛에 의한 그림자 생성여부는 조명에서 castShadow를 통해 지정이 가능합니다.
디퍼드 랜더링일 경우에는 그림자 연산이 상대적으로 적게 들어갑니다. 미리 어디에 그림자를 그려야 할 지를 기록한 뒤에 한꺼번에 그리기에.
다만 매쉬가 많아지면 각 매쉬의 그림자를 미리미리 계산해두어야 하기 때문에 퍼포먼스가 저하된다?
Tip 나나이트
나나이트 활성화는 하이 폴리곤에 한하는 것을 추천합니다.
나나이트 자체로도 내부에 오류 처리를 위한 연산 등이 들어가기 때문에 lowPoly에 나나이트를 거는 것은 과하게 연산비용을 잡아먹게 될 수 있습니다.
실시간으로 연산이 진행되기 때문에 나무같은 경우에는 지저분해 질 수 있습니다.
언리얼 엔진에 스캔데이터로 올라가는 매쉬가 많습니다.
굳이 움직이는 것이 아니라면 조명에 stationary를 사용해도 된니다.
라이트가 겹칠때는 최대 4개까지만 계산한다고 합니다.
라이트 최적화
최적화 뷰모드 -> 라이트 복잡도
특정 지점을 바라보았을 때 프레임이 확 떨어진다면 라이팅 연산이 복잡해져서일 수도 있습니다.
빛이 많이 겹치는 부분은 하얀색으로 표시됩니다.
Spot < point < Rect 로 연산량을 잡아먹는다고 합니다.
환경광 시스템
창 -> 환경 라이트 믹서
맵에 배치된 조명들을 한꺼번에 확인 가능한 창입니다.
Directional Light, SkyAtmosphere, Exponential Fog(여기서부터 제대로 복습 필요)
Exponential Height Fog의 Volumetric Fog를 켜야 god ray 효과를 줄 수 있습니다.(구름 사이로 빛이 내려오는 연출)
또한 실내 환경에서 빛이 번지는 효과를 줄 때도 사용됩니다.
volumetric fog 시 해상도 문제가 있을 수 있는데, 콘솔에서 r.VolumetricFog.GridPixelSize 값을 변경하는 것으로 임시적으로 변경을 주어 해결할 수 있으나 어디까지나 임시변경이니 영구적으로 저장하고 싶다면 DefaultEngine.ini에서 [/Script/Engine.RendererSettings]항목에 콘솔변수를 추가해준다면 프로젝트 설정으로 변경됩니다. 기본 값은 8이고 4로 수정하면 큰 문제는 없을 것이라 합니다.
LightFunction Material
LF는 LightFunction으로 조명에 사용되는 머티리얼에 주로 붙습니다.
MaterialDomain으로 LightFunction을 지정하면 EmissiveColor만 활성화되지만 여기에 색을 지정해도 빛 색에 반영되는 것은 아니라고 합니다. 무대 조명에 셀로판지 처럼 한 겹 통과하는 용도? 내부적으로 scalar 값으로 처리가 된다고 합니다.
Decal
스티커처럼 메시에 붙이는 기능으로 쓰거나, 조명을 사용하기 부담스러울 때 Fake Light로 사용하기 합니다.
Fake Light : 진짜 조명처럼 조명연산으로 되는 것은 아니지만, 조명이 붙어 있는 것처럼 보이게 하는 효과
Decal을 배치하기 위한 DecalActor라는 것이 존재합니다. Decal이 어느 방향을 향하게 할지를 화살표로 표시해줍니다.