Unity/그래픽스프로그래밍

0506_ 홀로그램 만들기

minquu 2021. 5. 6. 17:09
반응형

텍스처 한 장을 받는 쉐이더 작성

Lambert 적용

프레넬 공식 적용 (rim 라이트 공식)

Rim 까지 만들어 놓기

 

Shader "Custom/Holo"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimColor("Color", Color) = (1,1,1,1)
        _RimPow("Pow", Range(0,10)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert 
        #pragma target 3.0

        sampler2D _MainTex;
        float _RimPow;
        float4 _RimColor;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
        };


        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            float Rim = dot(o.Normal, IN.viewDir);
            o.Emission =   pow(1 - Rim, _RimPow) * _RimColor.rgb;
            o.Albedo = 0;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 

 

-----

 

랜더 타입을 알파로 해서 투명하게 보이게 하기

 

 Tags {"RenderType"="Transparent" "Queue"="Transparent"}

 

 

      #pragma surface surf Lambert alpha:fade

 

추가하기

 

  void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            float rim = dot(o.Normal, IN.viewDir);
            rim = pow(1 - rim, _RimPow);
            //o.Albedo = 0;
            o.Alpha = rim;
        }

림 값만 받아주기 

 

Shader "Custom/Holo"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimColor("Color", Color) = (1,1,1,1)
        _RimPow("Pow", Range(0,10)) = 0
    }
    SubShader
    {
        Tags {"RenderType"="Transparent" "Queue"="Transparent"}
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade
        #pragma target 3.0

        sampler2D _MainTex;
        float _RimPow;
        float4 _RimColor;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
        };


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

 

---

 

컬러 추가하기

 

 

 

 

----

 

깜장으로 만들어준다.

 

Input 에 float3 worldPos; 추가하기

 

월드 좌표가 컬러로 바뀐다.

 

 

태그를

오파큐로 바꾸면 불투명하게되서 여러 색이 섞인다.

 

 

 

 

RGB 따라 받을 수도 있다.  R  G  B    = X   Y  Z 와 같다.

 

 

-----

내장 함수중에 frac이 있다. 소수점 부분만 리턴해준다.

1. 1

1. 2

1. 3 

 

1값은 빼고 0.1 ~ 0.9 값만 리턴해줌 

 

g 값을 프락하면 

 

 

 

frac 한 곳에 pow 를 해주면, 더 촘촘해진다.

 

 

 

 

pow 제곱을 하면 조금 더 부드럽게 보여진다 

 

 

Shader "Custom/Holo"
{
    Properties
    {
        _RimColor ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimPow ("Pow", Range(0,10)) = 0.5
    }
    SubShader
    {
        Tags { "RenderType"="Qpaque" "Queue"="Transparent" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade
        #pragma target 3.0

        sampler2D _MainTex;
        float4 _RimColor;
        float _RimPow;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
            float3 worldPos;
        };
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            float rim = dot(o.Normal, IN.viewDir);
            rim = pow(1 - rim, _RimPow);
            //o.Emission = _RimColor.rgb;
            o.Emission = pow(frac(IN.worldPos.g), 40);
            //o.Alpha = rim;
            o.Alpha = 1;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 

제곱을 하면 그려지는 제곱지수함수 ( 리니어한 선을 부드럽게 해주는 것이다.)

 

 

 

prac 파워를 밖에서 뚫어서 관리도 가능 하겠지?

-----

 

 

 

 o.Emission = pow(frac(IN.worldPos.g * _G), _fracPow);

 

g 값과 frac 값이 달라질때의 차이점

 

frac 값이 달라지면

 

 

한 줄 내에 대한 두께가 달라진다.

 

-

 

g 값이 달라지면 

줄 내부가 아니라 줄 끼리의 간격이 달라진다.

 

 

 

 

---

 

Shader "Custom/Holo"
{
    Properties
    {
        _RimColor ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimPow ("Pow", Range(0,10)) = 0.5
        _fracPow ("FracPow", Range(0,100)) = 0
        _G ("G", Range(0,100)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Qpaque" "Queue"="Transparent" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade
        #pragma target 3.0

        sampler2D _MainTex;
        float4 _RimColor;
        float _RimPow;
        float _fracPow;
        float _G;
        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
            float3 worldPos;
        };
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            float rim = dot(o.Normal, IN.viewDir);
            rim = pow(1 - rim, _RimPow);
            //o.Emission = _RimColor.rgb;
            //o.Emission = pow(frac(IN.worldPos.g), _fracPow);
            o.Emission = pow(frac(IN.worldPos.g * _G - _Time.y), _fracPow) * _RimColor.rgb;
            //o.Alpha = rim;
            o.Alpha = 1;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

  o.Emission = pow(frac(IN.worldPos.g * _G - _Time.y), _fracPow) * _RimColor.rgb;

 

Emission에 G 위치를 _Time.y 써서 올려준다.

 

 

 

 

 

 

 

---

 

간격 // 속도 등등 조절하는 프로퍼티를 만들수도있다

 

Shader "Custom/Holo"
{
    Properties
    {
        _RimColor ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimPow ("Pow", Range(0,10)) = 0.5
        _fracPow ("FracPow", Range(0,100)) = 0
        _G ("G", Range(0,100)) = 0
        _TimeSpeed ("TimeSpeed", Range(0,10)) = 0.5
        _Interval ("Interval", Range(0,10)) = 0.5
    }
    SubShader
    {
        Tags { "RenderType"="Qpaque" "Queue"="Transparent" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade
        #pragma target 3.0

        sampler2D _MainTex;
        float4 _RimColor;
        float _RimPow;
        float _fracPow;
        float _G;
        float _TimeSpeed;
        float _Interval;
        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
            float3 worldPos;
        };
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            float rim = dot(o.Normal, IN.viewDir);
            rim = pow(1 - rim, _RimPow);
            //o.Emission = _RimColor.rgb;
            //o.Emission = pow(frac(IN.worldPos.g), _fracPow);
            o.Emission = pow(frac(IN.worldPos.g * _G * _Interval - (_Time.y * _TimeSpeed)), _fracPow) * _RimColor.rgb;
            //o.Alpha = rim;
            o.Alpha = 1;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 o.Emission = pow(frac(IN.worldPos.g * _G * _Interval - (_Time.y * _TimeSpeed)), _fracPow) * _RimColor.rgb;

 

 

 

 

 

 

-----

 

 

만든 것 알파에 넣어주기 

 

 

 

Shader "Custom/Holo"
{
    Properties
    {
        _RimColor ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimPow ("Pow", Range(0,10)) = 0.5
        _fracPow ("FracPow", Range(0,100)) = 0
        _G ("G", Range(0,100)) = 0
        _TimeSpeed ("TimeSpeed", Range(0,10)) = 0.5
        _Interval ("Interval", Range(0,10)) = 0.5
    }
    SubShader
    {
        Tags { "RenderType"="Qpaque" "Queue"="Transparent" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade
        #pragma target 3.0

        sampler2D _MainTex;
        float4 _RimColor;
        float _RimPow;
        float _fracPow;
        float _G;
        float _TimeSpeed;
        float _Interval;
        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
            float3 worldPos;
        };
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Emission = _RimColor;


            float rim = dot(o.Normal, IN.viewDir);
            rim = pow(1 - rim, _RimPow) + pow(frac(IN.worldPos.g * _Interval - (_Time.y * _TimeSpeed)), _fracPow);


            o.Alpha = rim;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 

 

 

 

-----

 

 

Emission에 직접 없어서 투명하게가 아니라 일반적인 텍스쳐에 입혀보기

 

Shader "Custom/Holo"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Normal ("Normal", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1)
        _RimPow("RimPow", Range(0,10)) = 0
        _RracPow("PracPow", Range(0,100)) = 0
        _G ("GPow", Range(0,100)) = 0
        _TimeSeed ("TimeSpeed", Range(0,100)) = 0

    }
    SubShader
    {
        Tags {"RenderType"="Qpaque" "Queue"="Transparent"}
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert

        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _Normal;
        float4 _Color;
        float _RracPow;
        float _G;
        float _TimeSeed;
        float _RimPow;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_Normal;
            float3 viewDir;
            float3 worldPos;
        };


        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_Normal, IN.uv_Normal));
            o.Albedo = c.rgb;
            float rim = saturate(dot(o.Normal, IN.viewDir));
            o.Emission = saturate((pow(1 - rim, _RimPow) + pow(frac(IN.worldPos.g * _G - (_Time.y * _TimeSeed)), _RracPow)) * _Color.rgb);

        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 

 

반응형