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