역자의 말.
2006년 게임브리오를 사용 하던 무렵에 처음으로 이러한 기법을 사용했었습니다.
사실 그 당시에는 흔히 말하는 Matcap 이라고 명칭이 정의 되지 않았었죠.
그리고 실제로 2004년도 부터 간단한 리플렉션 반사(가짜)에 사용 되던 기법의 파생일 뿐입니다.
픽솔로직 지브러시에는 2005년 후반에 이미 들어가 있었는데 엄격히 보면 지브러시 개발사에서 응용을 했던 것이죠.
2006년 당시 맥스 뷰포트가 워낙 구렸고 맥스 뷰포트에서 간단한 .fx 셰이더를 사용해서 구현 했던 적이 있습니다.
이후 모바일 게임 개발 트렌드가 2012년 부터 업계 전반에 걸쳐 도래했을 때 꽤나 각광 받게 된 기법이죠. 2012년 까지만 해도 큐브맵 리플렉션도 성능하락을 유발 시키는 주범으로 주목되던 때 였으니까 말이죠. 2011년도에 개발하던 코덱스 더 워리어 라는 프로젝트에도 유용하게 사용했었습니다. 방패나 금속 아머 같은 곳에 반사효과(가짜) 등을 넣을 때 말이죠.
아무튼... 오랜 시간이 흘렀지만 일부 활용하는 것은 여전합니다. 화각 중심에서 벗어난 오브젝트의 matcap 좌표 변형에 대한 글을 오래전에 본 적이 있어서 이렇게 포스팅을 해 봅니다. 사실 이 원문을 쓴 저자의 나름 연구하고 그런 흔적이 좋아서 간단히 번역글로 올려보게 되었네요.
원문 저자의 블로그.
원문 포스팅.
머리말
태그에 UE를 넣었지만 내용은 UE가 많지 않은 쉐이더 / 재질에 관한 것입니다. UE를 검증 환경으로 사용했기 때문에 태그를 지정했습니다.
요약
Matcap이라는 기술은 종종 가벼운 방식으로 고품질 조명을 재현하는 데 사용됩니다.
자세한 내용은 이 사이트를 참고로 하는 것이 더 빠르지만, 대략적으로 설명하자면, 미리 렌더링된 이미지를 사용하여 빛을 표현하는 방식입니다.
카메라에서 보이는 조명 결과를 영상에 저장하고, 통상의 방향에 따른 영상을 참조함으로써, 의사 조명을 수행할 수 있다. 복잡한 조명 계산없이 고품질의 조명 결과 (의사 임에도 불구하고)를 얻을 수 있기 때문에 Unity 및 VRChat 서클에서 자주 사용되는 것 같습니다.
이번에는 익숙한 환경으로 인해 UnrealEngine (UE-5.0.0)으로 검증했습니다 만, 제가 하고 있는 것은 엔진에 의존하지 않기 때문에 유니티 등 어떤 환경에서도 사용할 수 있습니다.
또한 기사에 사용된 ColorGrid는 다음과 같습니다.
배포되는 것을 사용했습니다.
MATCAP 문제
먼저, 표준 Matcap 계산에서는 화면 가장자리에 오브젝트가 있으면 UV가 왜곡되는 문제가 있습니다.
화면 중앙에 놓았을 때는 아래와 같이 깔끔하게 텍스처가 붙습니다.
하지만 대상 오브젝트가 화면 가장자리에 있으면 아래와 같이 UV가 왜곡되어 원하는 라이팅 결과를 얻을 수 없습니다.
이때의 머트리얼은 이런 상태입니다.
트위터에서 이 문제에 대한 수정 방법을 제안하는 사람이 있어 거기서 힌트를 얻어 더욱 개선했다.
트위터에서 제안된 방법을 시도해봤습니다.
UE 표준 화각 90도로 제안된 방법을 시도해 본 결과는 다음과 같습니다.
확실히 좋은 느낌으로 보정되어 있습니다. 하지만 트위터의 방식으로도 화각을 넓혀보면...
이렇게 왜곡이 생깁니다. 그래서 제가 조정을 해봤는데요.
이런 결과가 나왔습니다. 이마저도 왜곡이 남아있기 때문에 해결책이 아니라 해결방안이라는 수준이지만요.
애초의 문제
표준 Matcap의 방법으로 돌아가서, 왜 UV가 돌아가는지에 대해 조금 더 설명하겠습니다.
여기만 수기 자료 기반이 됩니다(구두로 설명할 때의 자료를 재사용).
우선 UV 전개는 왼쪽 위 그림과 같이 뷰 공간에서의 노멀 방향에 따라 UV 전개가 이루어집니다.
대상 오브젝트가 정면에 있을 때는 좋지만, 오른쪽 위 그림과 같이 화면 가장자리로 가면 보이는 범위와 UV 전개되는 범위가 어긋나서 UV가 돌아가는 끝이 보이게 됩니다. :sweat:
이를 보정하기 위해 화면 가장자리로 갈수록 기울어지는 시선 방향 벡터를 사용하여 보정해 주면 됩니다. 이것이 바로 이번 방법입니다. 화각이 넓으면 화면 가장자리의 시선 방향 벡터의 기울기가 커집니다. 그래서 화각이 넓으면 보정 효과가 너무 커서 왜곡이 두드러지는 결과를 낳았습니다.
이번 개선 방법
먼저, 트위터의 기법에서 사용된 ShaderForge의 NormalBlend의 공식은 아마도...
위 블로그의 마지막에 있는 blend_rnm() 함수입니다.
또한, 위 사이트에 나와 있는 식은 노멀맵의 텍스처에 저장된 상태에서 다시 텍스처에 저장된 상태로 되돌리기까지 하고 있는데, 셰이더 내에서 하기에는 무리가 있습니다.
그것들을 생략한 함수가 아래 함수입니다.
half3 blend_rnm(half3 n1, half3 n2)
{
half3 t = n1 * half3(-1, -1, 1) + half3(0, 0, 1);
half3 u = n2 * half3(-1, -1, 1);
half3 r = normalize(t*dot(t, u) - u*t.z);
return r;
}
이 중 보간계수가 될 수 있는 것이 함수 내 첫 번째 줄의 의 부분인데, 이를 1.25로 변경한 것이 제가 개선한 방법입니다. + half3(0, 0, 1);
전환 기능 등을 포함해서 최종 머티리얼은 다음과 같은 형태가 되었습니다.
정리
시야 공간의 XY로 UV를 만들기 때문에 발생하는 돌림현상 문제를 시선 방향을 이용해 보정한다. 라는 것이 이 대응의 핵심입니다.
따라서 시선 방향 외에 다른 좋은 보정 기준이 있다면 그것을 사용해도 좋고, 블렌딩 방법도 RNM이 아닌 다른 방법을 사용해도 좋을 것 같습니다.
혹시 다른 좋은 보정 방법을 생각하시는 분이 계시면 알려주세요!
역자 각주.
기사와 상관 없지만~~~ 보너스.
저도 주로 애용하는 matcap 리소스 모음 사이트 입니다.
'TECH.ART.FLOW.IO' 카테고리의 다른 글
[번역][기초]커스텀 익스프레션 프로젝트 경로 사용하기. (0) | 2023.09.24 |
---|---|
[번역]Use Runtime Virtual Textures to Improve Landscape Performance in Unreal Engi (0) | 2023.09.21 |
[번역]Memory Statistics - Texture (0) | 2023.09.19 |
PBR WORKFLOW TEMPLATE by 이종석 TA님 (0) | 2023.09.19 |
[번역]Brief Analysis of UE5 Rendering Pipeline (0) | 2023.09.19 |