디퓨즈 셰이딩 004

Unity3D/Shader 2016. 9. 24. 23:20

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


BRDF 디퓨즈 (BRDF Diffuse)
- 페이크 림 라이팅 기법이다.
- 양방향 반사도 분포 함수 (Bidirectional Reflectance Distribution Function)라 한다.
- 디퓨즈 라이팅은 각도에만 의존하며 카메라의 이동·회전에 의한 영향을 받지 않는다.
- 허나 BRDF 디퓨즈는 뷰 방향과 라이트 방향으로부터 불투명한 표면에 반사되는 방식으로 보여지는 시점에 따라 라이팅이 달라진다.
- 이 기법은 게임에서 라이팅을 조정하기보단 아티스트가 포토샵에서 텍스처를 갱신하기 쉽기 때문에 생산팀에 좋은 기법이다.
Shader "ExampleShaders/Chapter1/BRDFDiffuse" 
{
	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
		_RampTex ("Ramp Texture", 2D) = "white"{}
	}
	
	SubShader 
	{
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf BasicDiffuse
		#pragma target 3.0

		float4 _EmissiveColor;
		float4 _AmbientColor;
		float _MySliderValue;
		sampler2D _RampTex;
		
		inline float4 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
		{
			float difLight = dot (s.Normal, lightDir);
			float rimLight = dot(s.Normal, viewDir);
			float hLambert = difLight * 0.5 + 0.5;
			float3 ramp = tex2D(_RampTex, float2(hLambert, rimLight)).rgb;
			
			float4 col;
			col.rgb = s.Albedo * _LightColor0.rgb * (ramp);
			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"
}

뷰 방향 파라미터를 사용하면, 매우 간단한 폴오프 타입 이펙트를 만들 수 있다. 이 파라미터를 다양한 타입의 이펙트를 만드는데 사용할 수 있는데, 예를 들어 버블 타입의 투명도, 림 라이팅 이펙트, 실드 이펙트, 툰 방식의 아웃라인 이펙트 등이 있다.



핵심은 라이팅 함수 안에서 복잡한 라이팅 이펙트를 시뮬레이션하고자 표면 주의를 감싸기 위해 내적 함수로부터 얻은 값이 무엇인지, 그리고 텍스처를 어떻게 조작할 수 있는지 이해하는 것이다.

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

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

설정

트랙백

댓글