집게사장의 꿈

[Unity URP Shader] Direction Light 본문

그래픽

[Unity URP Shader] Direction Light

Krapboss 2024. 4. 17. 04:33

[출처] 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;
}


 

 

결과