Unity/Shader

[5.6] 홀로그램 2

ljw4104 2021. 5. 6. 16:07

Shader "Custom/Test"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _Power ("Power", Float) = 3.0
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque"}

        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        float _Power;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
            float3 worldPos;
        };
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            float rim = saturate(dot(o.Normal, IN.viewDir));
            o.Albedo = 0;
            o.Emission = IN.worldPos.rgb;
            o.Alpha = 1;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

  • Emission 부분에 월드좌표를 RGB로 변환해서 넣어줌.
  • X -> R / Y -> G / Z -> B
float3 worldPos - contains world space position.
https://docs.unity3d.com/Manual/SL-SurfaceShaders.html

Frac함수 : 소숫점 아래로만 반환하는 함수

소숫점이 반복되어서 반환되고 있다.

o.Emission = frac(IN.worldPos.g);

위의 그림은 연결지점이 끊켜보인다.

o.Emission = pow(frac(IN.worldPos.g), 40);

제곱을 하여 중간값을 만들어냈다. 좀 더 자연스러워 졌다.

반복적으로 출력할 수도 있다.

o.Emission = pow(frac(IN.worldPos.g * 3 - _Time.y * _Power), _FracPower);

각각의 값, 3 , _Time.y , _Power, _FracPower 값을 변경하면서 다른 결과를 얻을 수 있다.

지금까지 한 것을 Alpha에 적용시키면 홀로그램에 적용시킬 수 있다.

void surf (Input IN, inout SurfaceOutput o)
{
    fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
    float rim = saturate(dot(o.Normal, IN.viewDir));
    o.Emission = _Color;
    o.Alpha = pow(frac(IN.worldPos.g * 10 - _Time.y * _Power), _FracPower);;
}

 


연습

Shader "Custom/Test"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpTex ("Albedo (RGB)", 2D) = "bump" {}
        _Power ("Power", Float) = 3
        _Interval ("Interval", Float) = 10
        _Speed ("Speed", Float) = 3
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade

        sampler2D _MainTex;
        sampler2D _BumpTex;
        float _Power;
        float _Interval;
        float _Speed;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpTex;
            float3 viewDir;
            float3 worldPos;
        };
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_BumpTex, IN.uv_BumpTex));
            o.Albedo = 0;
            float rim = saturate(dot(o.Normal, IN.viewDir));
            o.Emission = _Color.rgb;
            //첫번째
            //o.Alpha = pow(frac(IN.worldPos.g * 10 - _Time.y * _Power), _FracPower);;

            //두번째
            o.Alpha = (1 - rim) * 0.5 + pow(frac(IN.worldPos.g * _Interval - _Time.y * _Speed), _Power);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

많이 헷갈린다

집에가서 Shader 부분 처음부터 다시 조금 봐야할듯