유니티 surface shader로 Unlit shader 만들기.

 

회사에서 Unlit 물 셰이더가 필요해서 버텍스 프랴그먼트로 짜려다 너무 귀찮아서 구글 뒤져보니... 커스텀 라이팅으로 unlit을 만들더군요...  저장!!

 

 

CGPROGRAM
 #pragma surface surf NoLighting 

.

.

중략

.

.

 fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten){
         fixed4 c;
         c.rgb = s.Albedo;
         c.a = s.Alpha;
         return c;   
         }

 

기억해두자~

Posted by 프리랜서 디자이너

내장 BlinnPhong Shader를 커스텀 라이트 로 표현

 

커스텀 버텍스 스펙큘러 라이트......알파에 스펙뮬러를 적용 안한 라이트라 버텍스로 스펙쿨러가 적용되고있다....

예제는 여기 까지지만 노멀과 림, 리플렉션 등등을 넣으려면 이 커스텀 라이트는 기본 모델일뿐 적용할곳을 몇군데 바꿔야 하는 라이트가 되겠네....역시 예제는 예제일뿐... 실제 적용은 다른 얘기지....

 

다음 공부는 거의 모든 기능이 들어간 서피스 라이트 하나 구현해보고 플레그먼크 셰이더로 넘어가 보자.....

 

 

Shader "DY/surf_Specular" {
 Properties{
  _MainTex("Texture",2D)="white"{}
 }
 
 SubShader{
  Tags{"RenderType"="Opaque"}
  CGPROGRAM
  #pragma surface surf SimpleSpecular
  
  half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten){

   half3 h = normalize (lightDir + viewDir);

 //스펙큘러를 위한 하프노말.

 

   half diff = max(0, dot(s.Normal, lightDir));

//디뷰즈 라이트를 위한 닷..max함수로 음수로 못돌아가게 한것 같다.
   
   float nh = max(0,dot(s.Normal,h));

//하프노멀에 노멀을 닷 해 스펙큘러를 구했다 역시나 max함수 사용.
   
   float spec = pow(nh, 48.0);

//pow함수를 이용해 스펙큘러 구현.
   
   half4 c;
   c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);

//모든 라이트가 버텍스라이트로 들어가 있다.

 

   c.a = s.Alpha;

//여기서 알파는 별달리 의미가 없다


   return c;
  }
  
  struct Input{
   float2 uv_MainTex;
  };
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }
  
  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

 

 

 

 

 

 

Posted by 프리랜서 디자이너

surface shader Custom Light 예제 따라하기~

 

 

 

==================================================================================================================

심플 램버트 라이트.....내장 램버트 라이트를 따라한 커스텀 라이트

 

Shader "DY/surf_Diffuse" {
 Properties{
  _MainTex("Diffuse",2D)="white"{}
 }
 SubShader{
  Tags {"RanderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf SimpleLambert
  
  half4 LightingSimpleLambert(SurfaceOutput s, half3 lightDir, half atten){
   half NdotL = dot(s.Normal, lightDir);
   half4 c;
   c.rgb = s.Albedo * _LightColor0.rgb *(NdotL * atten *2);
   c.a = s.Alpha;
   return c;
  }
  //커스텀 램버트 라이트

 


  struct Input{
   float2 uv_MainTex;
  };
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }
  
  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

==================================================================================================================

 

하프 램버트 라이트.....밸브의 하프 램버트를 구현한 커스텀 라이트

 

Shader "DY/surf_wraf" {
 Properties{
  _MainTex("Diffuse",2D)="white"{}
 }
 SubShader{
  Tags {"RanderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf WrafLambert
  
  half4 LightingWrafLambert(SurfaceOutput s, half3 lightDir, half atten){
   half NdotL = dot(s.Normal, lightDir);
   half diff = NdotL*0.5+0.5;
   half4 c;
   c.rgb = s.Albedo * _LightColor0.rgb *(diff * atten *2);
   c.a = s.Alpha;
   return c;
  }
  //커스텀 하프램버트 라이트

  //half diff = NdotL*0.5+0.5;

 


  struct Input{
   float2 uv_MainTex;
  };
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }
  
  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

 

==================================================================================================================

 

컬러 텍스쳐를 활용한 커스텀 툰 라이팅.........텍스쳐 메모리 때문에 아마 사용할 일은 없을듯 

 

Shader "DY/Toon Ramp" {
 Properties{
  _MainTex("Diffuse",2D)="white"{}
  _Ramp("shading Ramp",2D)="gray"{}
 }
 SubShader{
  Tags {"RanderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Ramp
  
  sampler2D _Ramp;
  
  half4 LightingRamp(SurfaceOutput s, half3 lightDir, half atten){
   half NdotL = dot(s.Normal, lightDir);
   half diff = NdotL*0.5+0.5;
   half3 ramp = tex2D(_Ramp, float2(diff)).rgb;
   half4 c;
   c.rgb = s.Albedo * _LightColor0.rgb *ramp*(atten *2);
   c.a = s.Alpha;
   return c;
  }

//툰 램프 커스텀 라이트
//half3 ramp = tex2D(_Ramp, float2(diff)).rgb;

 

  struct Input{
   float2 uv_MainTex;
  };
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }
  
  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

=======================================================================================================================

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 프리랜서 디자이너

 

TintFinalColor 셰이더.........

 

예제파일이 내 유니티 버전과 마지 않는건지 표면지시자가 없다고 나온다...그래서 걍 내식 대로? 고쳐서 넣었다..... 뭐하러 그리 어려게 작성 한걸까???

 

마찬가지로 버텍스에 포그 컬러 넣는 셰이더도 같은 이유로 작성이 안된다.. 패스...귀찮아 내일 부터는 서피스 라이팅이다~

 

 

Shader "DY/TintFinalColor" {
 Properties{
  _MainTex("Texture",2D)="white"{}
  _ColorTint("Tint",Color)=(1.0,1.0,1.0,1.0)
 }
 SubShader{
  Tags{"RenderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Lambert
  
  struct Input{
   float2 uv_MainTex;
  };
  
  fixed4 _ColorTint;
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb*_ColorTint;
  }

//디퓨즈에 컬러속성을 곱해서 색을 입혀준다..방식은 멀티 플라이라고 보면됨.


  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

 

 

 

 

 

Posted by 프리랜서 디자이너

Normal Extrusion 추가....노멀값을 조절 해 메쉬를 뿔리는 셰이더??? 뿔린 메쉬를 뒤집어 툰셰이딩에 응용한다고도 한다....

 

 

Shader "DY/NormalExtrusion" {
 Properties{
  _MainTex("texture",2D)="white"{}
//  _Amount("Extrusion Amount",Range(-1,1))=0.0
  _Amount("Extrusion Amount",float)=0.0
 }

//슬라이드 조절바가 불편해서 수치 입력으로 바꿨다....


 SubShader{


  Tags{"RanderType"="Opaque"}
  CGPROGRAM
  #pragma surface surf Lambert vertex:vert
  
  struct Input{
   float2 uv_MainTex;
  };
  
  float _Amount;


  void vert (inout appdata_full v){
   v.vertex.xyz +=v.normal * _Amount;
  }

// cg구문에 옵션에 해당하는 구문

//cg에 정의 되있는 Apptata를 활용해 메쉬가 뿔어나 보이게 만들었다...
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
  }
  ENDCG
 }
 FallBack"Diffuse"
}

 

 

 

 

 

 

 

Custom Vertex Color 추가 ..... 로컬좌표 버텍스에 노멀 컬러를 입혔다...... 어디다 쓰지 ???

 

 

Shader "DY/CustomVertex" {
 properties{
  _MainTex("Texture",2D)="white"{}
 }
 SubShader{
  Tags{"RenderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Lambert vertex:vert
  
  struct Input{
   float2 uv_MainTex;
   float3 customColor;
  };
  
  void vert (inout appdata_full v, out Input o){
   o.customColor = abs(v.normal);
  }

// cg구문에 옵션에 해당하는 구문

//cg에 정의 되있는 Apptata를 활용해 버텍스에 컬러를 입혔다...

//ui쪽엔 버텍스에 컬러 접근해 컬러 바꾸던데... 그런데서나 쓸수 있으려나?
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
   o.Albedo *= IN.customColor;
  }
  
  ENDCG
 }
 FallBack"Diffuse"
}

 

 

 

 

 

 

 

 

 

 

Posted by 프리랜서 디자이너

Cubemap Reflection 넣기......

 

이번 예제파일을 살짝 변경했다 좀더 쎄게~ 강하게~찐하게~ ㅋㅋ

 

worldRefl 라는 내장 함수를 사용해 간단히 구현한다.... 정말 번거롭지 않게 만들어 놓은 서피스 셰이더....

 

 

Shader "DY/WordRef1"{

 

 Properties{

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

  _Cube("CubeMap",CUBE) = ""{}

 }

 

 SubShader{

  Tags{"RenderType"="Opaque"}

  CGPROGRAM

  #pragma surface surf Lambert

  

  struct Input{

   float2 uv_MainTex;

   float3 worldRefl;

  };

  //worldRef1 내장 함수 선언 reflect 내장함수와 같은 의미 인듯 하다...

 

  sampler2D _MainTex;

  samplerCUBE _Cube;

  float3 texcol;

  //심심해서 조금 바꿔보려고 변수하나 추가했다

 

  void surf(Input IN, inout SurfaceOutput o){

   texcol = tex2D(_MainTex,IN.uv_MainTex).rgb;

   texcol*=texcol;

//텍스쳐 끼리 곱해 멀티플라이 효과를 준당

 

   o.Albedo = texcol;

   o.Emission = texCUBE(_Cube,IN.worldRefl).rgb;

  }

//Emission 에 큐브를 적용한다 이 Emission을 넣으면 전체적으로 밝아지게됨 빛나보이게하려고 그런거 같다....

 

 

  ENDCG

 }

 Fallback"Diffuse"

}

 

 

 

 

 

Cubemap Reflection 에 Normal Map 추가 하기.....

 

이유는 잘 모르겟으나...(뒤져봐야겠지..)INTERNAL_DATA 는 입력 구조체가 필요하고, 픽셀당 반사벡터에 필요한 내장 함수인 WorldReflectionVector(,) 를 넣어야한다~

 

 

Shader "DY/WordRef1_bump" {

 Properties{
  _MainTex("Texture",2D) = "white"{}
  _Cube("CubeMap",CUBE) = ""{}
  _BumpMap ("Bumpmap", 2D) = "bump" {}
 }
 
 SubShader{
  Tags{"RenderType"="Opaque"}
  CGPROGRAM
  #pragma surface surf Lambert
  
  struct Input{
   float2 uv_MainTex;
   float3 worldRefl;
   float2 uv_BumpMap;
   INTERNAL_DATA

  };
  // INTERNAL_DATA 구조체 추가~ 뭐하는 넘일까...

 


  sampler2D _MainTex;
  samplerCUBE _Cube;
  sampler2D _BumpMap;
  float3 texcol;
  
  void surf(Input IN, inout SurfaceOutput o){
   texcol = tex2D(_MainTex,IN.uv_MainTex).rgb;
   texcol*=texcol;
   o.Albedo = texcol;
   o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
   o.Emission = texCUBE (_Cube, WorldReflectionVector (IN, o.Normal)).rgb;

  }

//Emission에 WorldReflectionVector 내장 함수를 넣었다....

//이건 픽셀당 반사 백터를 구하기 위한이란다 그러니까 노멀이 들어가서 필요하게된 변수 라는거지


  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

 

 

 

Slices via World Space Position 구현하기....

 

딱히 쓸일이 있을진 모르겠다.....

clip() Cg/HLSL 함수를 사용해서 구현하고 월드 좌표는 내장 함수인 worldPos 변수를 사용한다......

 

Shader"DY/Slices"{

 Properties{

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

  _BumpMap("BumpMap",2D)="Bump"{}

 }

 

 SubShader{

 

  Tags{"RenderType"="Opaque"}

  

  Cull Off

  //메쉬의 뒷면을 살려라!!~~ 라는것

 

  CGPROGRAM

  #pragma surface surf Lambert

  

  struct Input{

   float2 uv_MainTex;

   float2 uv_BumpMap;

   float3 worldPos;

  };

  

  sampler2D _MainTex;

  sampler2D _BumpMap;

  

  void surf (Input IN, inout SurfaceOutput o){

   clip (frac((IN.worldPos.y+IN.worldPos.z*0.1)*5)-0.5);

//함수와 월드 좌표를 이용해 메쉬를 잘라진 것처럼 랜더링 걸어  버린다.

 

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

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

  }

 

  ENDCG

 }

 Fallback"Diffuse"

}

 

 

 

 

 

 

 

 

 

 

Posted by 프리랜서 디자이너

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 프리랜서 디자이너

서피스 셰이더 공부 시작.....예전에 문서 다 읽어 봤지만 마치 처음 읽어 보는 것 같은 이 이상한 기분..;;;;

 

이번은 서피스 셰이더 예제 따라하기~

 

1. 램버트 라이트 에 색상만 출력하는 초 간단 셰이더

 

Shader "DY/surf_ex_001" {
 SubShader{
  Tags{"RenderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Lambert

//기본으로 지정되있는 램버트 라이트 사용
  
   struct Input {
    float4 color : COLOR;
   };

//인풋은 달랑 색상만 받는다


   void surf (Input IN, inout SurfaceOutput o){
    o.Albedo = 0.5;
   }

//Albedo는 색상(Diffuse) 정하는 구문이고 0.5 는 컬러값 (회색)을 준다.
  ENDCG
  }
  //SubShader
}
//Shader

 

 

 

 

 

==========================================================================================

 

 

2. 텍스쳐 추가...디퓨즈 셰이더

 

Shader "DY/surf_ex_002" {
 Properties{
  _MainTex("Texture",2D)="White"{}
 }
 SubShader{
  Tags{"RanderType"="Opaque"}
  CGPROGRAM
  #pragma surface surf Lambert
  
  struct Input{
   float2 uv_MainTex;
  };
  //인풋에 메인 텍스쳐의 uv정보를 받아온다.


  sampler2D _MainTex;
  //2D텍스쳐를 사용하기 위한 참조.


  void surf(Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }

//디퓨즈에 해당하는Albedo에 메인 텍스쳐와 인풋의 uv정보를 적용.
  
  ENDCG
 }
 Fallback "Diffuse"

//그래픽카드가 안맞거나 오류가 생기면 디뷰즈 셰이더로 대체.
}

 

 

 

 

 

 

==========================================================================================

 

 

3. 범프맵 추가 ......(사칙연산이 되는구나......좋다! 서피스!!)

 

Shader "DY/surf_ex_003" {
 Properties{
  _MainTex("Texture",2D)="white"{}
  _BumpMap("Bumpmap",2D)="bump"{}
 }
 SubShader{
  Tags{"RanderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Lambert
  
  struct Input{
   float2 uv_MainTex;
   float2 uv_BumpMap;
  };
  //인풋에 범프맵 uv추가.


  sampler2D _MainTex;
  sampler2D _BumpMap;

//범프맵도 2D텍스쳐니까 참조 추가.
  
  void surf(Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
   o.Normal = UnpackNormal (tex2D(_BumpMap, IN.uv_BumpMap));
  }

//유니티의 노말압축을 풀어주고(UnpackNormal) 범프맵과 uv정보 적용


  ENDCG
 }
 Fallback"Diffuse"
}


 

 

==========================================================================================

 

 

Posted by 프리랜서 디자이너