사용하는 구조체는 SurfaceOutput
albedo, normal, emission 이거는 standard랑 똑같이 쓰면 되고, Specular, Gloss가 다르다.
그런데 Lambert에서 넣어봤자 변화는 없으며, 다른 BlinnPhong Shader를 쓸 때 쓰는 것임
Lambert Shader를 구현한
CG 프로그램 코드이다.
CGPROGRAM
// Lighting + Test, ambient 제거
#pragma surface surf Test noambient
sampler2D _MainTex;
sampler2D _BumpTex;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = tex.rgb;
o.Normal = UnpackNormal(tex2D(_BumpTex, IN.uv_BumpTex));
}
// 여기서 Lighting + Test이다. 위 #pragma surface surf "Test" noambient이다.
// surf에서 out된 SurfaceOutput을 s로 넣게 된다.
// lightDir은 조명벡터를 뒤집은 것 - 내적을 쉽게 하기 위함
// atten은 감쇠 (조명이 거리에 따라 약해진 정도)
float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)
{
float albedoHelper = dot(s.Normal, lightDir);
albedoHelper = saturate(albedoHelper); // Clamp (0 ~ 1)
// 받은 빛의 세기 연산
float4 final;
final.rgb = albedoHelper * s.Albedo * _LightColor0.rgb * atten;
// 빛의 세기 * 물체 고유 색 * 조명의 색상 * 감쇠
final.a = s.Alpha;
return final;
}
ENDCG
여기서 Half Lambert도 있는데, 이건 내적의 cos 함수 특성 상
0으로 갈수록 급격히 떨어지기 때문에 확 어두워지는 것을 막기 위해 약간 처리를 하는 개념이다.
위 albedoHelper에 * 0.5 + 0.5 정도를 해주면 된다.
'Unity' 카테고리의 다른 글
[Unity] Lim 라이트와 Fresnel 공식 (쉐이더 스타트업) (0) | 2023.02.12 |
---|---|
[Unity] Lambert와 Blinn-Phong (쉐이더 스타트업) (0) | 2023.02.12 |
[Unity] Standard Shader SurfaceOutputStandard (쉐이더 스타트업) (0) | 2023.02.04 |
[Unity] Render Texture와 Raw Image 활용 (0) | 2022.09.19 |
[Unity] 텍스처 (그래픽스 최적화 스타트업) (0) | 2022.08.27 |