Featured image of post 리플렉션 작업

리플렉션 작업

별 생각없이 ‘대충 이쁘면 되지 뭘’ 이란 마인드로 제작된 리플렉션.
뭐 그런대로 대충 이쁘긴 한데 뭔가 좀 큐브맵 각도가 이상하다.
쉐이더가 이쁘다기 보다 모델링이 잘되어서 이쁜 느낌.
반사되는 모습이 꼭 로컬좌표계의 노말맵인것 같은…
이상하게 유니티는 월드변환 노말맵 단계가 없어도 제대로 노말이 표현되어서, 그냥 써온것이 화근이었다.

그래서 노말 계산을 아예 수동으로 일일히 받아봐 계산을 때려줬다.
애석하게도 버텍스 쉐이더에서 바이노말 연산을 하고 싶었는데 out 에서 하나 더 나가면 오버플로우 나서 실패.
할 수 없이 부하를 각오하고 픽셀쉐이더에서 계산.

vertex:vert

struct Input
{
  float3 normalWS : TEXCOORD3;
  float3 tangentWS : TEXCOORD4;
};

void vert (inout appdata_full v, out Input o)
   {
  o.viewDirWorld = mul( (float3x3)_Object2World, -ObjSpaceViewDir( v.vertex ) );  //same to upper line
  // we transform the normal and tangent in world space as well
  o.normalWS = mul( _Object2World, float4(v.normal,0) ).xyz;
  o.tangentWS = mul( _Object2World, float4(v.tangent.xyz,0) ).xyz;
  //~ o.binormalWS = binormalWS;  이걸 여기서 계산하면 오버플로우 OTL
  }

void surf (Input IN, inout SurfaceOutput o)
{
  half4 NormalTex2 = tex2D (_BumpMap2, IN.uv_BumpMap2);
  o.Normal =  normalize(half3(NormalTex2.rg,1)*2.0f-1.0f);

  // we cross product directly from world space vectors so we save one transform
  float3 binormalWS = cross( IN.normalWS, IN.tangentWS ) ; // 그래서 여기서 계산
   
  // transform the normal by our world space tangent space
  // this gives us a normal in world space
  float3 WorldNormal= o.Normal .x * normalize(IN.tangentWS);
  WorldNormal += o.Normal .y * normalize(binormalWS);
  WorldNormal += o.Normal .z * normalize(IN.normalWS);    
  WorldNormal= normalize(WorldNormal); // 여기서 합쳐줌
   
//Reflect—————————————————— 
  float3 reflectVec = reflect( IN.viewDirWorld ,WorldNormal); // 여기서 씀.
  half3 ReflectTex = texCUBE (_Reflection, reflectVec ).rgb;
  ReflectTex *= NormalTex2.b;
  Albedo = lerp (ReflectTex*2, ReflectTex * MainTex.rgb, 1-_RefTexDimmer ) +MainTex.rgb;

결과는 확실히 이쪽이 이쁘다. 반사가 제대로여.

Hugo로 만듦
JimmyStack 테마 사용 중