새소식

그래픽

[Unity URP Shader]Rim 오브젝트 강조

  • -

[출처] Unty Shader Training

https://youtu.be/mlNWoROvavY?si=7XpTECHR_CJ5u62d

 

 

struct VertexInput
{
    float4 vertex : POSITION;
    float3 normal : NORMAL;
};

struct VertexOutput
{
    float4 vertex  	: SV_POSITION;
    float3 normal   : NORMAL;			
    //Vector 대신 사용 가능한 예약어
    float3 WorldSpaceViewDirection : TEXCOORD0;
};

float _RimPower, _RimInten;
half4 _RimColor;
VertexOutput vert(VertexInput v)
{
    VertexOutput o;      
    o.vertex = TransformObjectToHClip(v.vertex.xyz); 				         	
    o.normal = TransformObjectToWorldNormal(v.normal);
    //각 Vertex에서 카메라를 바라보는 방향
    o.WorldSpaceViewDirection = normalize(_WorldSpaceCameraPos.xyz - TransformObjectToWorld(v.vertex.xyz));		
    return o;
}					

half4 frag(VertexOutput i) : SV_Target
{	  	
    float3 light = _MainLightPosition.xyz;
    float4 color = float4(0.5, 0.5, 0.5, 1);			

    half3 ambient = SampleSH(i.normal);
    //카메라방향과 오브젝트 노말값을 내적한 크기  
    half face = saturate(dot(i.WorldSpaceViewDirection, i.normal));

    //face가 소수점이면 _RimPower가 작을수록 1- face 에 가까운 값이 나온다.
    //Rimpower가 강할 수록 더욱 강한 색이 나온다
    half rim = 1.0 - ( pow(face, _RimPower));

    //Lighting 적용
    color.rgb *= saturate(dot(i.normal, light)) * _MainLightColor.rgb + ambient ;	

    //Rim 적용
    color.rgb += rim * _RimInten * _RimColor;

    return color;
}

 

 

# 월드 기준 오브젝트가 카메라를 향한 방향 벡터를 구한다.
o.WorldSpaceViewDirection =
normalize(_WorldSpaceCameraPos.xyz - TransformObjectToWorld(v.vertex.xyz));        

# 오브젝트의 normal 벡터와 카메라 벡터의 내적을 구한다
half face = saturate(dot(i.WorldSpaceViewDirection, i.normal));

# 오브젝트의 테투리 강조를 위한 것으로, 밝기를 정한다.
half rim = 1.0 - ( pow(face, _RimPower));

#빛이 모두 적용된 컬러에 강조효과를 추가한다.
color.rgb += rim * _RimInten * _RimColor;

 

 

인스펙터

 

 

결과

'그래픽' 카테고리의 다른 글

[Unity Shader Graph] Rim 아이템 강조효과  (0) 2024.04.23
[Unityy URP Shader] 축 정보  (0) 2024.04.19
[Unity URP Shader] 툰 라이팅 기본  (0) 2024.04.17
[Unity URP Shader] Direction Light  (0) 2024.04.17
[Unity URP Shader] 웨이브  (0) 2024.04.17
Contents

아핫

땡큐하다