0506 쉐이더 라이트닝 연산
2021. 5. 6. 11:23ㆍunity/쉐이더
물리 벡터 : 방향+크키
수 벡터 : 위치
각각의 버텍스에도 벡터를 가지고 있다.
노멀벡터 - 조명벡터 = 밝기가 계산된다. (-1이면 가장 어두움)
docs.unity3d.com/Manual/SL-SurfaceShaders.html
라이트 이름 설정 : Test
Lighting + Test 이름으로 함수 선언
반환타입은 float4
매개 변수 (SurfaceOutput s,
float3 lightDir //조명의 단위 벡터,
float atten //빛의 감쇠)
램버트 공식 : saturate(표면 벡터와 조명 벡터를 내적)
//saturate는 optional
0~1까지를 표현,
그 값을 반환
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)
{
//return float4 (1, 0, 0, 1);
float ndotl = dot(s.Normal, lightDir);
return ndotl;
}
ENDCG
float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)
{
//Lambert
//saturate: 0~1 사이로 잘라준다.
//float ndotl = max (0,dot(s.Normal, lightDir));
float ndotl = saturate(dot(s.Normal, lightDir));
//hal-Lambert
float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5;
return ndotl;
}
ENDCG
하프 램버트 공식 : 표면벡터와 조명 벡터를 내적 0.5*0.5
라이트 함수 내에서 SurfaceOutput 구조체 값 사용 가능
ex ) s.Albedo
float4 LightingTest (SurfaceOutput s, float3 lightDir, float atten)
{
float ndotl = (dot(s.Normal, lightDir)*0.5+0.5);
float4 final;
final.rgb = ndotl * s.Albedo * _LightColor0.rgb * atten;
final.a = s.Alpha;
return final;
}
ENDCG
'unity > 쉐이더' 카테고리의 다른 글
0506 쉐이더 블린퐁 (0) | 2021.05.06 |
---|---|
0506 쉐이더 Rim Light + Hologram (0) | 2021.05.06 |
0504 쉐이더 커스텀 라이트 Lambert, BlinnPhong, Standard (0) | 2021.05.04 |
0504 쉐이더 특정 부분만 반짝거리게 하기 (0) | 2021.05.04 |
0504 버텍스에 컬러 입히고 다중 텍스쳐 반영하기 (0) | 2021.05.04 |