[출처] Unty Shader Training
https://youtu.be/mlNWoROvavY?si=7XpTECHR_CJ5u62d
VertexOutput vert(VertexInput v)
{
VertexOutput o;
float4 positionWS = TransformObjectToHClip(v.vertex.xyz);
o.normal = TransformObjectToWorldNormal(v.normal);
o.vertex = positionWS;
return o;
}
half4 frag(VertexOutput i) : SV_Target
{
//light
//유니티 라이트를 무조건 한 방향에서만 빛이 온다는 것이 전제
//라이트의 노말위치를 반환해준다고 생각하면 좋을듯
/*float3 light = _MainLightPosition.xyz;
//기본색상
float4 color = float4(1,1,1,1);
color.rgb*= saturate(dot(i.normal, light)) * _MainLightColor.rgb ;// _TintColor * _Intensity * i.color;
*/
Light lit = GetMainLight();
float4 color = float4(1,1,1,1);
color.rgb *= saturate(dot(i.normal, lit.direction)) * lit.color;
//위 내용 축소판
//color.rgb *= LightingLambert(_MainLightColor.rgb, _MainLightPosition.xyz, i.normal);
return color;
}
# 현재 오브젝트의 노말 좌표 얻어오기 #보통 Vertex간 CCW가 노말값이다. o.normal = TransformObjectToWorldNormal(v.normal);
#cos(x)값을 통한 0~1값 얻기 # normal 값을 내적하면, cos(X)의 값과 동일해진다. 그렇게 나온 계산값에 color 값을 가미해준다.
color.rgb *= saturate(dot(i.normal, lit.direction)) * lit.color;
# 0~ 1 사이값 반환
saturate( 'x' )
#Light 정보 Light GetMainLight() { Light light; light.direction = _MainLightPosition.xyz; light.distanceAttenuation = unity_LightData.z; light.shadowAttenuation = 1.0; light.color = _MainLightColor.rgb; return light; }
|
결과