일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- OculusMotionVectorPass
- Three(Two) Tone Shading
- working set
- 메모리 누수
- ColorGradingLutPass
- 프로그래밍 기초
- 게임 수학
- Cartoon Rendering
- AppSW
- 벡터
- Windows Build
- 개인 바이트
- 가상 바이트
- Specular
- URP
- ASW(Application SpaceWarp)
- Virtual Byte
- Cell Shader
- C언어
- 3d
- Cell Look
- Rim Light
- Toon Shader
- URP로 변경
- Private Bytes
- VR
- 작업 집합
- Today
- Total
WinCNT
MatCap 셰이더를 만들어보자 본문
서론
이번에 맡은 일은 기존 셰이더에 MatCaps를 추가하는 일이다
사실 그래픽스를 공부할 때 MatCaps를 배워서 몇 줄 안 되는 코드로 적용했던 기억이 있다
제발 그 기억이 맞기를…….
그래서 MatCap란게 뭐야?
MapCap이란 Material Capture의 약자이며, 라이팅 정보를 담은 구체가 그려진 텍스처, 혹은 그 텍스처를 적용한 의사 라이팅 표현을 뜻한다
MatCap을 이용하면 라이팅 처리 없이 가볍게 라이팅을 표현할 수 있다
물론 어디까지나 의사 라이팅 표현이기 때문에 여러 제한이 있다
예를 들어 광원이 없어도 빛난다던가, 카메라 시점에 따라서 아티팩트가 보인다던가 등등
하지만 실제 라이팅 처리보다 매우 가볍기 때문에 예전의 모바일에서 라이팅 처리 대신 MatCap 사용했던 적도 있으며, 지금도 빙결 등의 상태 이상을 간단히 표현할 때 쓰이곤 한다
MatCap의 텍스처는?
MapCap의 텍스처는 다음과 같이 생겼다(무료 배포 Matcap)
Matcap의 텍스처는 구체가 머테리얼을 꽉 차게 하고 거친 표면을 피해야 좋다
(Matcap으로 거친 표면을 표현하고 싶다면 차라리 Matcap용 노멀 맵을 추가하는 게 낫다)
Matcap 셰이더의 구현
다음은 Matcap 셰이더의 구현 원리를 직관적으로 표현한 이미지가 있어서 가져와봤다
(항상 신세지고 있습니다 LIGHT11상!)
간단히 번역하자면 노멀 벡터와 시점의 각도에 따라서 Matcap 텍스처를 샘플링한다는 의미이다
실제 구현은 카메라 스페이스에서의 노멀 벡터의 x, y좌표를 UV좌표에 대응하는 식으로 만든다
아래는 샘플 코드이다
// 버텍스 셰이더
v2f vert(const appdata v)
{
v2f o;
// 기타 등등은 생략
o.normal = TransformObjectToWorldNormal(v.normal);
o.matcap_coord = mul((float3x3)UNITY_MATRIX_V, o.normal).xy * 0.5 + 0.5;
return o;
}
// 프래그먼트 셰이더
float3 frag(v2f i) : SV_Target
{
// 기타 등등은 생략
// _Matcap은 Matcap 텍스처
float4 matcapColor = tex2D(_Matcap, i.matcap_coord);
Color *= matcapColor;
return Color;
}
Matcap의 장단점
장점
일반적인 라이팅 처리보다 가벼우며, 아티스트의 직관대로 텍스처를 작성할 수 있다는 것이 장점이다
그리고 장점이랄 것까지는 없지만, 구체에 Matcap을 적용하면 Matcap 텍스처가 그대로 나온다
(Spherical Environment Map-구면 환경 맵과 비슷한 느낌)
단점
Matcap은 실제의 라이트와 전혀 상관이 없기 때문에 라이트의 방향이 강하게 인식되는 장면에서는 Matcap에 대해 위화감이 느껴진다
그리고 시점이 고정되면 크게 위화감이 없지만, 반대로 카메라가 여러 방향으로 이동하거나 회전하면 Matcap에 뒤틀림이 보이게 되는 문제가 발생하기도 한다
그리고 카메라가 자주 이동하거나 회전할 때 위화감이 느껴지는 경우가 많다
Matcap에 뒤틀림 문제
Matcap은 정면에서 보면 위화감이 없는데 카메라의 끝쪽으로 가면 뒤틀림이 보이는 경우가 있다
해당 문제 원래라면 안 보일 부분이 투영 행렬(원근법)에 의해 보이게 되는 게 원인이라고 생각된다
(아닐 수도 있음)
아무튼 해당 문제를 해결하기 위해서는 UV를 회전시키거나 해야 할 것이다
그런데 이번 Matcap은 보조적으로 사용하는 게 목적이라 대응하지 않기로 했다!!
그래도 일단 수정하는 법에 대해서는 찾았기 때문에 비망을 위해 해당 사이트를 첨부하려고 한다
물론 해본 적은 없기에 이걸로 수정될지는 모르겠다
유니티짱 툰 쉐이더에도 RotaeUV 같은 걸 본 것 같지만 기분 탓이겠지
마무리
확실히 Matcpa 구현 자체는 몇 줄 안 되는 코드로 할 수 있는 게 맞았다
하지만 구현을 위해 이것 저것 조사하다 보니 몇 줄 안 되는 코드 이상으로 공부가 되었다
그리고 Matcap에 뒤틀림 문제는 앞으로도 대응 안 하길 바랄 뿐이다…
참고 사이트
【Unity】【シェーダ】MatCap(スフィアマッピング)を実装する - LIGHT11
【Unity】MatCapについて覚え書き - SPARKCREATIVE Tech Blog
PBS 느낌을 흉내내기 위한 Metallic MatCap 쉐이더
複雑なシェーダいらず。一撃でハイライトや氷や鉄がつくれる"MatCap"【UE4 マテリアル】 - UE4 変なマテリアルまとめ
'Unity > URP or Shader 관련' 카테고리의 다른 글
URP에서 깊이를 기록하는 Depth Map 셰이더 만들어보기! + After Effect의 이미지의 레벨 조정(Levels adjustment) 흉내기기! (0) | 2024.01.23 |
---|---|
Unity의 Depth Texture에는 실제로 어떤 오브젝트가 기록되는 걸까?(feat. SSAO) (0) | 2024.01.22 |
UniTask를 이용한 스크립트로 포스트 프로세싱이 아닌 Fade In, Fade Out를 구현해보기 (0) | 2023.12.15 |
URP에서 Cutout(Alpha Test) 구현해보기(feat. Alpha to Coverage) (0) | 2023.12.06 |
커스텀 셰이더의 머티리얼을 Bakery(라이트 맵 생성 에섯)으로 Bake하기(feat. Meta Pass) (0) | 2023.10.12 |