유니티 쉐이더 스타트업 책을 읽다가 나온 홀로그램 코드에 저번 시간에 배운 내용들을 집어넣어, VCMask를 이용한 무지개빛(?)홀로그램을 만들었습니다. 책에 설명을 너무 쉽게 잘해주셔가지고 조금만 자세히 읽다보면 다양한 바리에이션으로 응용이 가능할거에요!
왼쪽 위 홀로그램은 기본 홀로그램 코드에 NormalMap과 Sin(시간)함수를 더한것입니다!
보시면 구형 오브젝트에 바둑판모양에 숫자들이 적힌(피면 오른쪽 오브젝트처럼되는)이미지에다가
아래에서 위로 올라가는 가로방향 줄모양으로 홀로그램이 만들어지고 있죠.
오른쪽 위 홀로그램은 평면 오브젝트에 VC마스크를 이용하여 다양한 색깔을 첨가한 결과물입니다.
마찬가지로 위로 올라가는 가로방향 줄무늬를 볼 수 있고, 시간흐름에 따라 색상이 바뀌는것도 포인트죠!
아래 네모모양 이미지는 오른쪽 위 오브젝트에 사용한 VCMask입니다.
오른쪽 위에있는 오브젝트가 어찌보면 최종결과물이니, 이에 대한 코드만 아래 첨부하겠습니다.
Shader "Eugene/hologramVCM"
{
Properties
{
_BumpMap("NormalMap", 2D) = "bump"{}
_RimPower("RimPower", float) = 3
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
CGPROGRAM
#pragma surface surf nolight noambient alpha:fade
sampler2D _BumpMap;
float _RimPower;
struct Input
{
float2 uv_BumpMap;
float3 viewDir;
float3 worldPos;
float4 color:COLOR;
};
void surf(Input IN, inout SurfaceOutput o)
{
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Emission = lerp(float3(1,0,0), float3(0,1,0), IN.color.r);
o.Emission = lerp(o.Emission, float3(0,0,1), IN.color.g);
o.Emission = lerp(o.Emission, float3(1,1,0), IN.color.b);
float rim = saturate(dot(o.Normal, IN.viewDir));
rim = pow(1-rim,_RimPower) + pow(frac(IN.worldPos.g * 3 - _Time.y), 30);
o.Alpha = rim * sin(_Time.y);
}
float4 Lightingnolight( SurfaceOutput s, float3 lightDir, float atten)
{
return float4(0,0,0,s.Alpha);
}
ENDCG
}
//그래픽 카드에서 쉐이더 연산을 실패했을 때 대체 쉐이더
FallBack "Transparent/Diffuse"
}
셰이더 사용자가 제어할 수 있는 부분이 적은데, 원하신다면 상수값을 넣은 부분을 변수로 만들어 Properties에 올려서 사용하시면 됩니다.
-이 글은 '유니티 쉐이더 스타트업, 정종필 저'를 기반으로 작성하였습니다.
'유니티 > 렌더링' 카테고리의 다른 글
[유니티]모델 안에 모델 셰이더 만들기 (0) | 2020.12.27 |
---|---|
[VFX그래프]노드 - Polar to Rectangular (0) | 2020.12.25 |
[유니티셰이더]유니티 Surface Shader 작성 메뉴얼 (0) | 2020.12.25 |
[유니티셰이더]불 이펙트 업그레이드 (0) | 2020.12.25 |