Notice
Recent Posts
Recent Comments
Link
스토리지
[5.6] Light 연산 (Lambert, Half-Lambert) 본문
* saturate(float a)
: 값을 0과 1 사이의 값으로 잘라줌. 0보다 작으면 0, 1보다 크면 1과 같은 방식.
float ndotl = saturate(dot(s.Normal, lightDir)); //normal벡터와 light벡터를 내적한 값. saturate: 0~1의 사이의 값으로 값을 잘라줌.
developer.download.nvidia.com/cg/saturate.html
saturate
Name saturate - returns smallest integer not less than a scalar or each vector component. Synopsis float saturate(float x); float1 saturate(float1 x); float2 saturate(float2 x); float3 saturate(float3 x); float4 saturate(float4 x); half saturate(half x); h
developer.download.nvidia.com
∵ 음수가 되면 예상치 못한 에러가 발생할 수 있기때문에 조명과의 각도가 90도인 지점부터 항상 0으로 바꿔버림.
* Half - Lambert
Half Lambert(하프 램버트) 라이팅은 Valve(밸브)가 Half-Life(하프 라이프)에서 처음 개발한 기법으로 물체 어두운 면의 형태를 잃지 않고, 너무 평평하게 보이지 않도록 하기 위해 고안됐다. 쉽게 설명하면 오브젝트의 어두운 부분을 너무 어둡지 않게 최소 0.5의 밝기로 라이팅을 넣어준다.
참고 : https://developer.valvesoftware.com/wiki/Half_Lambert
Shader "Custom/Test"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BumpTex ("Albedo (RGB)", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Test noambient
//Unity의 내장 함수대신에 함수를 커스텀함 이름 : Test
sampler2D _MainTex;
sampler2D _BumpTex;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
fixed4 d = tex2D (_BumpTex, IN.uv_BumpTex);
o.Albedo = c.rgb;
o.Normal = UnpackNormal(d);
o.Alpha = c.a;
}
//surf가 출력한 값을 바탕으로 계산하기에 밑에서 선언하는 편이 좋음.
//★ 위에 정의한 것 앞에 Lighting을 꼭 붙인 다음에 선언해야한다. ★ ex) Lighting + Test.
float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)
//s: 위에서 저장된 구조체, lightDir: 조명 (단위)벡터, atten: 감쇠(attenuation, 가까우면 밝아지고, 멀어지면 어두워진다.)
{
//조명이 가장 밝을때가 -1이기때문에 조명벡터가 뒤집혀서 들어온다.
float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5; //normal벡터와 light벡터를 내적한 값. Half-lambert
float4 final;
final.rgb = ndotl * s.Albedo * _LightColor0.rgb * atten; //_LightColor0 : 내장 LightColor
return ndotl;
}
ENDCG
}
FallBack "Diffuse"
}
Point Type의 Light를 사용하면 더 효과를 잘 볼 수 있다. ( 감쇠 )
'Unity > Shader' 카테고리의 다른 글
[5.6] Light 연산 연습 (0) | 2021.05.06 |
---|---|
[5.6] Light 연산 정리 (0) | 2021.05.06 |
[5.6] Lightening 계산 (0) | 2021.05.06 |
[5.4] Shader Lightening (0) | 2021.05.04 |
[5.4] Shader 2 (0) | 2021.05.04 |
Comments