디퓨즈 셰이딩 001

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

디퓨즈 (Diffuse)
Unity5에서 이 쉐이더는 Standard Shader로 대체되었다.
Diffuse는 간단한 (Lambert(램버트)) 라이팅 모델을 계산한다.
- 표면의 라이팅은 광원과의 각도가 작아질수록 약해진다. 
- 라이팅은 이 각도에만 의존하며 카메라의 이동·회전에 의한 영향을 받지 않는다.
Shader "ExampleShaders/BasicDiffuse"
{
	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
		
		// Properties 블록으로부터 프로퍼티의 값에 접근하기 위해
		// CGPROGRAM 안에 프로퍼티 변수의 타입을 선언해야 한다.
		float4 _EmissiveColor;
		float4 _AmbientColor;
		float4 _MySliderValue;

		// 뷰 방향이 필요하지 않은 포워드 랜더링에 사용
		// LightingName(SurfaceOutput s, half3 lightDir, half atten) {}

		// 뷰 방향이 필요한 포워드 랜더링에 사용
		// LightingName(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {}

		// 디퍼드 랜더링에 사용
		// LightingName_PrePass(SurfaceOutput s, half4 light) {}

		inline float4 LightingBasicDiffuse(SurfaceOutput s, fixed3 lightDir, fixed atten)
		{
			// 내적함수(dot)는 공간에서 두 벡터의 방향(-1 ~ 1)을 비교하는데 사용 할 수 있다. 
			// -1 = 평행하며 점점 멀어지는 벡터, 1 = 평행하며 점점 가까워지는 벡터, 0 = 수직 벡터
			float difLight = max(0, dot(s.Normal, lightDir));

			float4 col;
			col.rgb = s.Albedo * _LightColor0.rgb * (difLight * 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"
}

# 프로퍼티(Properties) 타입

 Range (min, max)

 최소값~최대값의 범위를 갖는 float형의 슬라이더를 만든다. 

 Color

 인스펙터 탭에 Color = (float, float, float, float)를 선택할 수 있는 색상 견본을 만든다.

 2D

 셰이더로 드래그 할 수 있는 텍스쳐 견본을 만든다.

 Cube

 2의 승수가 아닌 텍스쳐 견본을 만든다. 2D GUI 요소와 같은 기능을 한다.

 Rect

 인스펙터 탭에서 셰이더로 드래그할 수 있는 규브맵 견본을 만든다.

 Float

 인스펙터 탭에서 슬라이더가 아닌 float 값을 만든다.

 Vector

 방향, 색상을 만들 수 있는 4개의 float 프로퍼티를 만든다.


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

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

설정

트랙백

댓글