4. Rim Lighting 추가....

 

Shader"DY/surf_ex_004"{

 Properties{

 _MainTex("Texture",2D)="white"{}

 _BumpMap("Bump Map",2D)="bump"{}

 _RimColor("Rim Color",Color)=(0.5,0.5,0.5,0.5)

 _RimPower("Rim Power",Range(0.5,8.0))=3.0

 }

//프로퍼티에 림컬러와 림파워 추가

 

 

 SubShader{

 Tags{"RanderType"="Opaque"}

 

 CGPROGRAM

 #pragma surface surf Lambert

 

 

  struct Input{

   float2 uv_MainTex;

   float2 uv_BumpMap;

   float3 viewDir;

  };

  //인풋에 뷰다이렉션 추가

  

  sampler2D _MainTex;

  sampler2D _BumpMap;

  float4 _RimColor;

  float _RimPower;

//아웃풋에 림컬러와 파워를 전달하기위해 변수 선언

 

  void surf(Input IN, inout SurfaceOutput o){

   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;

   o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

   half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));

//정규화한 뷰다이렉션과 노멀의 내적을 구하고 1을 넘지한게 세추레이트 함수를 적용 후 뒤집는다.

//림과 림파와를 파워 함수를 적용하고 림컬러와 합성한다.

   o.Emission = _RimColor.rgb*pow(rim,_RimPower);

  }

 ENDCG

 }

 Fallback"Diffuse"

}

 

 

 

5.Detail Texture 추가.....

 

Shader"DY/surf_005"{

 

Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
      _Detail ("Detail", 2D) = "gray" {}
    }


    SubShader {
      Tags { "RenderType" = "Opaque" }


      CGPROGRAM
      #pragma surface surf Lambert


      struct Input {
          float2 uv_MainTex;
          float2 uv_BumpMap;
          float2 uv_Detail;
      };


      sampler2D _MainTex;
      sampler2D _BumpMap;
      sampler2D _Detail;


      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
          o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb * 2;

          //Albedo를 추가 해 텍스쳐를 멀티플라이형식으로 합성한다. 
          o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
      }


      ENDCG
    }
    Fallback "Diffuse"
  }

 

 

 


 

 

6. DetailMap screen space...변경 적용

 

Shader"DY/surf_ex_006"{

 

Properties {

      _MainTex ("Texture", 2D) = "white" {}

      _Detail ("Detail", 2D) = "gray" {}

    }

 

    SubShader {

      Tags { "RenderType" = "Opaque" }

 

      CGPROGRAM

      #pragma surface surf Lambert

 

      struct Input {

          float2 uv_MainTex;

          float4 screenPos;

      };

 

      sampler2D _MainTex;

      sampler2D _Detail;

 

      void surf (Input IN, inout SurfaceOutput o) {

          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;

          float2 screenUV = IN.screenPos.xy / IN.screenPos.w;

          screenUV *= float2(8,6);

    //float2에 스크린XY좌표와 W스케일 받아오기

   //각각 성분에 8,6 을 곱한값이 screenUV 이다.

          o.Albedo *= tex2D (_Detail, screenUV).rgb * 2;

      }

      ENDCG

    }

    Fallback "Diffuse"

  }

 

 

 

 

Posted by 프리랜서 디자이너