본문 바로가기
자료는 자료지/외부에서 퍼온자료

4. Unity 셰이더: MatCap과 박막 간섭 구현하기

by 대마왕J 2026. 1. 4.

이번에는 Unity Shader를 사용하여 흔히 '오색찬란한 검은색'이라 불리는 딱정벌레(Beetle) 질감을 구현하는 방법을 정리해 보았습니다. 물리학적으로는 박막 간섭(Thin-film interference)이라고 불리는 이 현상을, 고전적이지만 여전히 강력한 MatCap(Material Capture) 기술을 응용하여 만들어 보겠습니다.

1. 핵심 기술: MatCap (Material Capture)이란?

MatCap은 조명과 재질 정보를 미리 하나의 텍스처(구체 이미지)에 구워놓고, 카메라 공간의 법선(View Space Normal)을 기준으로 매핑하는 기술입니다.

  • 장점: 연산 비용이 매우 저렴하며, 복잡한 라이팅 없이도 독특한 질감을 낼 수 있습니다.
  • 단점: 시점에 따라 조명 방향이 고정되어 있어 회전 시 어색할 수 있고, 화면 가장자리에서 왜곡이 발생할 수 있습니다.

 

2. 구현 단계 1: MatCap 기본 세팅

MatCap의 핵심 로직은 법선 벡터를 UV 좌표로 변환하는 것입니다.

  1. 법선 변환: 월드 공간의 법선을 카메라(View) 공간으로 변환합니다. 이렇게 하면 모델을 회전시켜도 법선 정보가 카메라를 따라오게 됩니다.
  2. UV 매핑: 변환된 법선의 XY 성분만 추출합니다. 법선은 -1 ~ 1 범위를 가지므로, 이를 0 ~ 1 범위로 리매핑합니다.
    • 수식: UV = (ViewNormal.xy + 1.0) * 0.5
  3. 샘플링: 계산된 UV로 MatCap 텍스처를 샘플링합니다.

 

3. 구현 단계 2: 박막 간섭 (무지개색 효과)

딱정벌레 특유의 각도에 따라 변하는 색상을 표현하기 위해 프레넬(Fresnel) 효과를 활용합니다.

  • N dot V: 표면 법선과 시선 벡터의 내적을 구합니다.
  • Gradient Mapping: 1 - (N dot V) 값을 구하면 가장자리가 1, 중심이 0이 됩니다. 이 값을 UV의 U 좌표로 사용하여 무지개색 그라디언트 텍스처를 샘플링합니다.
  • 이 결과물을 베이스 컬러와 곱(Multiply)하여 색상 변화를 입힙니다.

 

4. 구현 단계 3: 디테일 추가 및 후처리

  • Additive MatCap: 왁스를 바른 듯한 코팅감을 주기 위해, 또 다른 MatCap 텍스처를 하나 더 추가하여 '더하기(Add)' 연산으로 얹어줍니다.
  • Normal Map: 표면의 미세한 요철을 위해 노멀 맵을 적용합니다.
  • Post-processing: ACES 톤매핑을 적용하여 색감의 대비와 채도를 보정하면 훨씬 사실적인 결과물을 얻을 수 있습니다.

 

5. 셰이더 코드 핵심 요약

노드 방식(ASE/Shader Graph)뿐만 아니라 코드로 구현할 때의 핵심 로직은 다음과 같습니다.

// 1. View Space Normal 계산
float3 viewNormal = mul(UNITY_MATRIX_V, float4(worldNormal, 0.0)).xyz;

// 2. MatCap UV 계산
float2 matcapUV = (viewNormal.xy + 1.0) * 0.5;
float4 matcapColor = tex2D(_MatCapTex, matcapUV);

// 3. Fresnel & Gradient Sampling
float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - worldPos);
float NdotV = dot(worldNormal, viewDir);
float rim = 1.0 - NdotV;
float4 rampColor = tex2D(_RampTex, float2(rim, 0.5));

// 4. 합성 (예시)
float3 finalColor = (baseColor * matcapColor * rampColor) + addMatCapColor;




반응형

댓글