WinCNT

MatCap 셰이더를 만들어보자 본문

Unity/URP or Shader 관련

MatCap 셰이더를 만들어보자

WinCNT_SSS 2024. 1. 15. 17:36

서론

이번에 맡은 일은 기존 셰이더에 MatCaps를 추가하는 일이다

사실 그래픽스를 공부할 때 MatCaps를 배워서 몇 줄 안 되는 코드로 적용했던 기억이 있다

제발 그 기억이 맞기를…….


그래서 MatCap란게 뭐야?

MapCap이란 Material Capture의 약자이며, 라이팅 정보를 담은 구체가 그려진 텍스처, 혹은 그 텍스처를 적용한 의사 라이팅 표현을 뜻한다

 

MatCap을 이용하면 라이팅 처리 없이 가볍게 라이팅을 표현할 수 있다

물론 어디까지나 의사 라이팅 표현이기 때문에 여러 제한이 있다

예를 들어 광원이 없어도 빛난다던가, 카메라 시점에 따라서 아티팩트가 보인다던가 등등

하지만 실제 라이팅 처리보다 매우 가볍기 때문에 예전의 모바일에서 라이팅 처리 대신 MatCap 사용했던 적도 있으며, 지금도 빙결 등의 상태 이상을 간단히 표현할 때 쓰이곤 한다


MatCap의 텍스처는?

MapCap의 텍스처는 다음과 같이 생겼다(무료 배포 Matcap)

 

Matcap의 텍스처는 구체가 머테리얼을 꽉 차게 하고 거친 표면을 피해야 좋다

(Matcap으로 거친 표면을 표현하고 싶다면 차라리 Matcap용 노멀 맵을 추가하는 게 낫다)


Matcap 셰이더의 구현

다음은 Matcap 셰이더의 구현 원리를 직관적으로 표현한 이미지가 있어서 가져와봤다

(항상 신세지고 있습니다 LIGHT11상!)

https://light11.hatenadiary.com/entry/2018/06/14/231424

 

 

간단히 번역하자면 노멀 벡터와 시점의 각도에 따라서 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 같은 걸 본 것 같지만 기분 탓이겠지

Matcapの歪み補正について - Qiita

 

Matcapの歪み補正について - Qiita

前書きタグにUEとかつけていますが、内容はUEはあまり関係なくシェーダ/マテリアルの話です。検証環境としてUEを使ったのでタグ付けしました。概要軽量に高品質のライティングを再現する

qiita.com


마무리

확실히 Matcpa 구현 자체는 몇 줄 안 되는 코드로 할 수 있는 게 맞았다

하지만 구현을 위해 이것 저것 조사하다 보니 몇 줄 안 되는 코드 이상으로 공부가 되었다

그리고 Matcap에 뒤틀림 문제는 앞으로도 대응 안 하길 바랄 뿐이다…


참고 사이트

【Unity】【シェーダ】MatCap(スフィアマッピング)を実装する - LIGHT11

 

【Unity】【シェーダ】MatCap(スフィアマッピング)を実装する - LIGHT11

MatCapとかスフィアマッピングとか呼ばれる手法の実装方法です。

light11.hatenadiary.com

【Unity】MatCapについて覚え書き - SPARKCREATIVE Tech Blog

 

【Unity】MatCapについて覚え書き - SPARKCREATIVE Tech Blog

初めまして、クライエントエンジニアの中島龍清(ナカシマリュウセイ)です。 エンジニア内に同姓の方がいるのでフルネームで名乗らせていただきました。 ブログを書くのが初めてのため拙

tech.spark-creative.co.jp

MatCapシェーダー

 

MatCapシェーダー

 

learn.foundry.com

MatCap Shader

 

MatCap Shader

MatCap Shader MatCaps, or "material captures" allows you to create a surface material and lighting environment simply by painting an object so that it looks like how you want your surface to appear. What happens is the shading of a spherical image is appli

learn.foundry.com

PBS 느낌을 흉내내기 위한 Metallic MatCap 쉐이더

 

PBS 느낌을 흉내내기 위한 Metallic MatCap 쉐이더

들어가며물리기반렌더링( Physically based rendering, PBR, Physically based shading, PBS, 이하 PBR, PBS)이라는 키워드가 떠오른 것은 꽤 오래 되었고 이미 PC나 콘솔에서는 널리 적용되었습니다. 최근 출시한 메

ozlael.tistory.com

複雑なシェーダいらず。一撃でハイライトや氷や鉄がつくれる"MatCap"【UE4 マテリアル】 - UE4 変なマテリアルまとめ

 

複雑なシェーダいらず。一撃でハイライトや氷や鉄がつくれる"MatCap"【UE4 マテリアル】 - UE4 

マテリアルノードを組むのはメンドクサイし難しい。絵を描くだけでそれっぽい質感になってほしい・・・ そんな時にそこそこ便利な「MatCap」の紹介です。 **ノードの組み方** **必要なテク

weirdmaterials.hatenablog.com

Matcapの歪み補正について - Qiita

 

Matcapの歪み補正について - Qiita

前書きタグにUEとかつけていますが、内容はUEはあまり関係なくシェーダ/マテリアルの話です。検証環境としてUEを使ったのでタグ付けしました。概要軽量に高品質のライティングを再現する

qiita.com