Action disabled: source

Surface Shader Lighting Examples

여기에 ''custom lighting models''Surface Shaders의 예들이 있습니다. 일반적인 표면 쉐이더 예들이 this page에 있습니다.

Deferred 조명이 어떤 사용자 정의의 재질 당 조명 모델과 함께 제대로 작동하지 않기 때문에 대부분의 예에서 우리는 쉐이더가 포워드 렌더링만으로 컴파일하도록 만듭니다.

Diffuse

우리는 내장된Lambert 조명 모델을 사용하는 쉐이더와 함게 시작할 것입니다:

Shader "Example/Diffuse Texture" {
  Properties {
    _MainTex ("Texture", 2D) = "white" {}
  }
  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 조명을 사용하는 대신에 우리 스스로의 조명 모델을 씁니다. Surface Shader Lighting Models은 우리가 써야할 필요가 있는 어떤 함수들 입니다. 여기에 간단한Lambert 가 있습니다. "shader part" 그 자체는 전혀 바뀌지 않았다는 것을 참고하세요:

%gray%Shader "Example/Diffuse Texture" {
%gray%  Properties {
%gray%    _MainTex ("Texture", 2D) = "white" {}
%gray%  }
%gray%  SubShader {
%gray%    Tags { "RenderType" = "Opaque" }
%gray%    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;
    }
    
%gray%    struct Input {
%gray%        float2 uv_MainTex;
%gray%    };
%gray%    sampler2D _MainTex;
%gray%    void surf (Input IN, inout SurfaceOutput o) {
%gray%        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
%gray%    }
%gray%    ENDCG
%gray%  }
%gray%  Fallback "Diffuse"
%gray%}

그래서 우리의 간단한 Diffuse 조명 모델이 LightingSimpleLambert 함수 입니다. 그것은 표면 normal과 조명 디렉션 사이에서 dot product를 수행하는 것에 의해 조명을 계산하고 빛의 감쇠와 색을 적용합니다.

Diffuse Wrap

여기에Wrapped Diffuse – Diffuse 조명의 변형- 있습니다. 거기서 조명은 물체의 모서리를 둘써 감쌉니다. 표면을 흐트러뜨리는 효과를 가장하기에 유용합니다. 다시 표면 쉐이더 자체는 전혀 바뀌지 않았습니다. 우리는 그저 다른 조명 함수를 사용하고 있습니다.

%gray%Shader "Example/Diffuse Wrapped" {
%gray%  Properties {
%gray%    _MainTex ("Texture", 2D) = "white" {}
%gray%  }
%gray%  SubShader {
%gray%    Tags { "RenderType" = "Opaque" }
%gray%    CGPROGRAM
    #pragma surface surf _WrapLambert_
    
    half4 LightingWrapLambert (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;
    }
    
%gray%    struct Input {
%gray%        float2 uv_MainTex;
%gray%    };
%gray%    sampler2D _MainTex;
%gray%    void surf (Input IN, inout SurfaceOutput o) {
%gray%        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
%gray%    }
%gray%    ENDCG
%gray%  }
%gray%  Fallback "Diffuse"
%gray%}

Toon Ramp

여기에 표면이 조명과 normal 사이의 각도에 어떻게 반응하는지를 정의하는 텍스쳐 램프를 사용하는"Ramp" 조명 모델이 있습니다. 이것은Toon 조명을 포함해서 다양한 효과를 위해 사용될 수 있습니다.

%gray%Shader "Example/Toon Ramp" {
%gray%  Properties {
%gray%    _MainTex ("Texture", 2D) = "white" {}
    __Ramp ("Shading Ramp", 2D) = "gray" {}_
%gray%  }
%gray%  SubShader {
%gray%    Tags { "RenderType" = "Opaque" }
%gray%    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;
    }
    
%gray%    struct Input {
%gray%        float2 uv_MainTex;
%gray%    };
%gray%    sampler2D _MainTex;
%gray%    void surf (Input IN, inout SurfaceOutput o) {
%gray%        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
%gray%    }
%gray%    ENDCG
%gray%  }
%gray%  Fallback "Diffuse"
%gray%}

Simple Specular

여기에 단순한 반사 조명 모델이 있습니다. 그것은 내장된BlinnPhong이 실제로 하는 것에 꽤 간단합니다; 우리는 그것이 어떻게 되는지를 보여주기 위해서 여기에 그것을 놓습니다.

%gray%Shader "Example/Simple Specular" {
%gray%  Properties {
%gray%    _MainTex ("Texture", 2D) = "white" {}
%gray%  }
%gray%  SubShader {
%gray%    Tags { "RenderType" = "Opaque" }
%gray%    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;
    }
    
%gray%    struct Input {
%gray%        float2 uv_MainTex;
%gray%    };
%gray%    sampler2D _MainTex;
%gray%    void surf (Input IN, inout SurfaceOutput o) {
%gray%        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
%gray%    }
%gray%    ENDCG
%gray%  }
%gray%  Fallback "Diffuse"
%gray%}

역링크