그래픽
[Unity URP Shader]Rim 오브젝트 강조
Krapboss
2024. 4. 17. 06:57
[출처] 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;
|
인스펙터
결과