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%}
- 출처: 유니티코리아위키 (CC BY-NC-SA 2.0)