본문으로 바로가기
반응형






원문 : http://docs.unity3d.com/kr/current/Manual/SL-SurfaceShaderLighting.html


표면 쉐이더에서 사용자 정의 라이팅 모델

Surface Shaders를 작성할 때 표면의 프로퍼티(albedo color, normal, …)를 설명하는 구문. 상단에 설계된 Lighting Model에 의해 계산되고 설명된다(첨부한 스샷은 Unlit lighting 모델. 즉 라이팅 계산을 받지 않고 Albedo값을 그대로 그린다. 다른거 쓰려면 이름도 바꾸고 noambient 빼줘야 된다~) 내장 라이팅 모델은 Lambert(디퓨즈 라이팅)과 BlinnPhong(반사 라이팅) 두가지이다.(이거 두개는 별도의 라이팅 모델을 넣지 않아도 된다.(얘네 두개는 Unity 내의 Lighting.cginc 파일에서 정의된다고 함)


Windows의 경우, {unity install path}/Data/CGIncludes/Lighting.cginc, Mac의 경우, /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).


라이팅 모델의 선언

    half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten);


       이것은 뷰 방향에 의존하고 있지 않은 라이트 모델의 포워드 렌더링 패스에서 사용

    half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);


     이것은 뷰 방향에 의존하고 있는 라이팅 모델의 포워드 렌더링 패스에서 사용

    half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);


   이것은 지연 라이팅 패스에 사용

모든 함수를 선언할 필요는 없다고 함. 라이팅 모델은 뷰 방향을 사용하거나(viewDir), 하지 않거나 중 하나. 마찬가지로, 라이팅 모델이 지연 라이팅에서 작동하지 않는 경우, _PrePass 함수를 선언하지 않고, 그것을 사용하는 모든 쉐이더는 포워드 렌더링에 대해서만 컴파일함.



 SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert

     
      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"
  }


 Lambert의 경우 이와같이 조명설계 공식이 없어도 된다.






    SubShader {
        Tags { "RenderType" = "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;
          }


 SimpleLambert 조명이라 이름 붙인 공식의 예(Unity 5부터 atten * 2 안해줘도 된다는 것 같은데 일단 예문에 붙어있으니 그냥 붙은채로 썻다)




BlinnPhong과 유사한 simpleSpecular 라이팅의 정의


 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));

        float nh = max (0, dot (s.Normal, h));
        float spec = pow (nh, 48.0);

        half4 c;
        c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);
        c.a = s.Alpha;
        return c;
    }




반응형

'Technical Report > Unity Shader' 카테고리의 다른 글

Unity 5 Standard Shader 구조 해석  (0) 2015.10.19
Unity 셰이더 Variants 최적화  (0) 2015.09.08
external lightmap shader 2nd UV  (0) 2015.08.04
Unity PostProcessing  (0) 2015.07.14
Unity5 compressed option  (0) 2015.07.05