디퓨즈 셰이딩 002

Unity3D/Shader 2016. 9. 23. 16:39

### 본 내용은 "(3D 게임 최적화와 시작적 효과를 위한) 유니티 Shader와 Effect 제작" 도서를 정리한 것입니다.


하프 램버트 디퓨즈(Half Lambert Diffuse)

- 밸브가 만든 기술로서, 어두운 곳에서 물체의 표면을 보여주기 위한 라이팅을 얻는 방법이다.

- 원래는 하프 라이프라는 게임에서 처음 개발한 기법이다.

- 기본적으로 머터리얼의 디퓨즈 라이팅을 밝게 만들고 물체의 표면 주의를 희미한 빛으로 감싼다.

- 비물리적인 기법이며 순전히 시각적인 향상으로 여기는 유연한 라이팅 모델이다.

Shader "ExampleShaders/Chapter1/HalfLambertDiffuse" 
{
	Properties 	
	{
		_EmissiveColor ("Emissive Color", Color) = (1,1,1,1)
		_AmbientColor  ("Ambient Color", Color) = (1,1,1,1)
		_MySliderValue ("This is a Slider", Range(0,10)) = 2.5
	}
	
	SubShader 
	{
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf BasicDiffuse
		#pragma target 3.0

		float4 _EmissiveColor;
		float4 _AmbientColor;
		float _MySliderValue;
		
		inline float4 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten)
		{
			float difLight = dot (s.Normal, lightDir);
			float hLambert = difLight * 0.5 + 0.5; 
			
			float4 col;
			col.rgb = s.Albedo * _LightColor0.rgb * (hLambert * atten * 2);
			col.a = s.Alpha;
			return col;
		}

		struct Input 
		{
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) 
		{
			float4 c;
			c =  pow((_EmissiveColor + _AmbientColor), _MySliderValue);	

			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		
		ENDCG
	} 
	
	FallBack "Diffuse"
} 

하프 램버트 공식은 Value 사에서 Half-Life에서 처음 소개된 방식으로 오브젝트가 너무 어둡게 나오는 것을 방지하기 위한 목적으로 사용되었다. (https://developer.valvesoftware.com/wiki/Half_Lambert)









기법은 디퓨즈 라이팅 값의 범위를 가지고, 반으로 나눈 뒤 0.5를 더하는 방식으로 동작한다.

float difLight = dot (s.Normal, lightDir); float hLambert = difLight * 0.5 + 0.5;


'Unity3D > Shader' 카테고리의 다른 글

이펙트를 위한 텍스처 사용하기 001  (0) 2016.09.26
디퓨즈 셰이딩 004  (0) 2016.09.24
디퓨즈 셰이딩 003  (0) 2016.09.24
디퓨즈 셰이딩 001  (0) 2016.09.22

설정

트랙백

댓글