본문 바로가기
Shader

카메라 방향에 상관없는 Matcap 만들기

by 대마왕J 2016. 3. 26.

Matcap은 화면에 따라 라이팅 방향이 변하지 않지요. 카메라 종속적이니까.

그러니까 화면 각도를 변하게 해도 ... 조명도 따라서 같이 각도가 돌아버린다는게 단점입니다.

 

...에 근데 왜 그래야 해요? 

 

 

라는 생각으로 후다닥 대충 만들어본 '월드 종속형 Matcap'

 

카메라 각도가 변해도 조명 방향은 그대로라는데 주목.

워낙 맷캡이 간단한 공식이었기때문에 이것도 간단해요.

 

 

뒷면으로 돌면 조명이 한 번 더 나오긴 하지만 이거 수정하는거 뭐 일도 아니니까...  

 

이걸 완성하면, Matcap이랑 동일한 무게의 공식으로, 조명이 카메라를 따라가지 않는 방법이 될겁니다.

즉 카메라가 빙글빙글 도는 게임에서도 Matcap을 사용할 수 있게 된다는 말이죠!

 

물론 이전에 쓰던 맷캡을 이용한 페이크 림라이트는 더이상 쓸 수 없지만 말이죠.

그런 경우에는 뭐. 가능합니다. 알파에다가 림라이트를 넣고, 이전 좌표계 노말을 뽑아서 다시 연산해 첨가해 주면 되니까 말이죠

 

 

 

 

 

Shader "MatCap/Vertex/Textured Multiply"
{
 Properties
 {
  _MainTex ("Base (RGB)", 2D) = "white" {}
  _MatCap ("MatCap (RGB)", 2D) = "white" {}
 }
 
 Subshader
 {
  Tags { "RenderType"="Opaque" }
  
  Pass
  {
   Tags { "LightMode" = "Always" }
   
   CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #pragma fragmentoption ARB_precision_hint_fastest
    #include "UnityCG.cginc"
    
    struct v2f
    {
     float4 pos : SV_POSITION;
     float2 uv  : TEXCOORD0;
     float2 cap : TEXCOORD1;
     float3 worldNomal : TEXCOORD2;
    };
    
    uniform float4 _MainTex_ST;
    
    v2f vert (appdata_base v)
    {
     v2f o;
     o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
     o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
     half2 capCoord;
     
     float3 worldNorm = normalize(_World2Object[0].xyz * v.normal.x + _World2Object[1].xyz * v.normal.y + _World2Object[2].xyz * v.normal.z);
     worldNorm = mul(v.normal,_World2Object); //걍 이부분만 바꿨음. 
     //worldNorm = mul((float3x3)UNITY_MATRIX_V, worldNorm);
     o.cap.xy = worldNorm.xy * 0.5 + 0.5;
     o.worldNomal = worldNorm;
     
     return o;
    }
    
    uniform sampler2D _MainTex;
    uniform sampler2D _MatCap;
    
    fixed4 frag (v2f i) : COLOR
    {
     fixed4 tex = tex2D(_MainTex, i.uv);
     fixed4 mc = tex2D(_MatCap, i.cap);
     //return float4(i.worldNomal.rrr,1);
     return tex * mc * 2.0;
    }
   ENDCG
  }
 }
 
 Fallback "VertexLit"
}

 

 

 

 

 

 

 

반응형

댓글