1. Bug1
해당 방식대로 제작하면 여러가지 버그가 생기는데 그 중 첫번째로 카메라가 바라보는 각도에 따라서 음영과도 같은 검은 부분이 생긴다
이 버그의 원인은 카메라가 바닥 평면과 평행에 가까워질수록 발생하는 문제.
해당 버그를 제어하기 위해 MF_DTM_GrazingAngle 함수를 제작한다.
이 함수는 표면의 법선에 기반하여 값을 변조할 때 사용될 값을 반환한다. 이 값은 깊이 외곽선 임계값에 곱해질 것.
이 함수는 카메라 시야 벡터에 대해 표면이 수직일수록, 합성 커널의 픽셀 간 깊이 불연속성을 고려해야 하는 엣지로 간주해야 할 필요가 더 커질 것이다.
Fresnel의 카메라와 마주보면 0을 반환하고 카메라에 수직이 될수록 1을 반환하는 성질을 이용하여 카메라와 표면 노말의 수직 여부를 판별한다.
Fresnel과 Output사이의 연산은 다음을 나타낸다.
Grazing Angle Mask Power 값이 클수록 1에서 0으로의 빠른 감소가 느려지도록 만드는 것이다. 여기에서 'saturate' 노드는 결과가 0 미만 또는 1 이상으로 가지 않도록 값을 제한하는 'clamp' 노드처럼 작동한다.
다음은 Grazing Angle Mask Power에 따른 Fresnel의 기울기 값이다. 값이 커질수록 완만해지는 것을 확인할 수 있다. 색깔로 구분가능하다.
함수를 통해 리턴하는 값은 Threshold Depth Outline에 적용할 값으로
PostProcss용 Material에서 Threshold DO에 위 그림처럼 적용하면 된다.
적용 후에는 그림처럼 더이상 구석에 음영이 지지 않는다. 또한 MF_DTM_GrazingAngle 함수 내부에 있는 Grazing Angle Modulation Factor값을 조절하여 각 프로젝트에 맞게 강도를 더욱 강하게 주거나 약하게 주어 원하는 형태로 적용이 가능하다.
2. Bug2
카메라를 멀리 당겨서 케릭터를 바라보면 케릭터가 아무 검게 칠해지는 현상이 발생한다.
이것은 아웃라인이 화면 텍스처 위에 직접 생성되기 때문에 카메라에 매우 가까운 객체와 매우 먼 객체 간에도 동일한 두께를 유지한다는 사실 때문이다.
카메라가 가까워질수록 카메라를 기준으로 물체가 커지기때문에 두께가 얇은 것 처럼 보인다.
해당 문제를 해결하기위해 두께를 조절하기위한 MF_ThicknessModulation 함수를 제작한다
현재 픽셀의 깊이를 기반으로 두께를 반환하는 함수다. 픽셀이 카메라를 기준으로 깊이 0에 위치한 경우, 카메라와 매우 근접한 경우다. 아웃라인 스트로크는 최대 크기를 갖게 된다.
카메라에서 멀어질수록 스트로크는 작아지며, 정의된 최대 거리에서 그 최소 크기에 도달할 때까지 계속 작아진다.
적절한 두께로의 조절을 위해 아래의 방정식을 사용한다.
주어진 깊이에 대해 해당 두께를 출력하는 a * x + b 형태의 음의 선형 함수를 찾기 위해, 우리는 두께가 카메라에 가까울 때, 즉 깊이가 0일 때 최대 값과 같아야 하며, 또한 카메라와의 최대 거리에서 최소 값과 같아야 한다는 것을 알고 있기 때문에 방정식을 풀어 이 음의 선형 함수를 이용한다. 이 함수를 아웃라인 쉐이더에서 사용할 수 있다.
해당 공식을 적용해서 생성한 MF_ThicknessModulation함수를 PostProcess용 Material에 아래와 같이 적용한다.
적용 후 결과
더이상 먼 거리에서 외곽선이 케릭터를 덮지 않는다는 걸 확인할 수 있다.
3. bug3
Outline Shader에서 종종 발생하는 문제인제 두께가 다르게 칠해지는 문제가 발생할 수 있다.
위의 MF_ThicknessModulation 함수는 Outline이 일정하지 못한 버그를 수정한 버전인데 원래라면 아래 그림처럼 Outline이 일정하지 않은 버그가 발생한다.
예를 들어, 아웃라인이 서로 다른 깊이를 가진 표면 사이에 배치되는 특별한 경우를 볼 수 있다. 이로 인해 일관되지 않은 아웃라인 두께가 발생한다.
쉐이더는 화면의 모든 픽셀을 통과하므로 각각의 픽셀은 자체 깊이와 자체 두께를 갖는다.
이 문제를 해결하기 위해 쉐이더를 수정하여 픽셀의 깊이를 아웃라인 두께를 정의하는 데 사용하는 대신, 합성 커널을 사용하고 카메라에 가장 가까운 커널의 픽셀의 깊이를 얻는다.
이렇게 하면 아웃라인의 두께는 카메라에 가장 가까운 객체를 기반으로 하므로 아웃라인에 일관성을 부여할 수 있다.
아래에 표시된 부분이 MF_ThicknessModulation함수에서 화면에 가장가까운 픽셀을 찾는 부분이다.
'Unreal Engine' 카테고리의 다른 글
Foot Ik(Control Rig) (0) | 2023.09.30 |
---|---|
Material Function(Outline Shader에 사용) (0) | 2023.09.30 |
Outline Shader - 1 (1) | 2023.09.29 |
GAS(Gameplay Ability System) Documentation (0) | 2023.09.28 |
BOTW Climbing시스템(젤다의 전설 벽타기) -3 (0) | 2023.09.28 |