글
디퓨즈 셰이딩 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 |