유니티3D 프로그래밍

Unity Shader 연습 (21.05.03, 21.05.06~07) 본문

Unity/수업내용

Unity Shader 연습 (21.05.03, 21.05.06~07)

tjdgus9955 2021. 5. 6. 11:49

색 변경

Shader "Custom/Test"
{
    Properties
    {
        _R ("Red", Range(0, 1)) = 0.0
        _G ("Green", Range(0, 1)) = 0.0
        _B ("Blue", Range(0, 1)) = 0.0
        _Brightness ("Brightness", Range(-1, 1)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows

        struct Input
        {
            float2 uv_MainTex;
        };

        float _R;
        float _G;
        float _B;
        float _Brightness;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            o.Albedo = float3(_R, _G, _B) + _Brightness;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

2개의 이미지 합체

Shader "Custom/Test2"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _MainTex2("Sand Texture", 2D) = "white" {}
        _MainTex3("Test", 2D) = "white" {}

        _lerpTest("lerp", Range(0,1)) = 0
    }
        SubShader
    {
        Tags { "RenderType" = "Opaque" }
        LOD 200

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows

        sampler2D _MainTex;
        sampler2D _MainTex2;
        sampler2D _MainTex3;
        float _lerpTest;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_MainTex2;
            float2 uv_MainTex3;
        };

        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            fixed4 d = tex2D(_MainTex2, IN.uv_MainTex2);
            fixed4 e = tex2D(_MainTex3, IN.uv_MainTex3);
            fixed4 avg = (d.r + d.g + d.b)/3;

            o.Albedo = lerp(c.rgb, avg, 1-c.a);
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

움직이는 큐브

Shader "Custom/Test3"
{
	Properties
	{
		_MainTex("Albedo (RGB)", 2D) = "white" {}

	}
		SubShader
		{
				Tags { "RenderType" = "Opaque" }

				CGPROGRAM

				#pragma surface surf Standard 

				sampler2D _MainTex;
				float _FlowSpeed;

				struct Input
				{
					float2 uv_MainTex;
				};

				fixed4 _Color;

				void surf(Input IN, inout SurfaceOutputStandard o)
				{
					float4 c = tex2D(_MainTex, float2(IN.uv_MainTex.x, IN.uv_MainTex.y + _Time.y));
					o.Albedo = c.rgb;
					//o.Emission = float3(IN.uv_MainTex.x, IN.uv_MainTex.y, 0);
					o.Alpha = c.a;
				}
				ENDCG
		}
			FallBack "Diffuse"
}

움직이는 화염

Shader "Custom/Fire"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _MainTex2("Albedo (RGB)", 2D) = "white" {}
        _Speed("Speed", Range(0, 20)) = 0.0
    }
        SubShader
    {
        Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }

        CGPROGRAM

        #pragma surface surf Standard alpha:fade

        sampler2D _MainTex;
        sampler2D _MainTex2;
        float _Speed;
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_MainTex2;
        };

        fixed4 _Color;

        void surf(Input IN, inout SurfaceOutputStandard o)
        {
            float4 d = tex2D(_MainTex2, float2(IN.uv_MainTex2.x * 3, IN.uv_MainTex2.y - _Speed * _Time.y));
            float4 c = tex2D(_MainTex, IN.uv_MainTex + d.r);

            o.Emission = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
        FallBack "Diffuse"
}

빛 반사 효과(Lambert)

Shader "Custom/Light"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _BumpMap("NormalMap", 2D) = "bump" {}
    }
        SubShader
    {
        Tags { "RenderType" = "Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Test noambient
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _BumpMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Alpha = c.a;
        }

        float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten) {

            //Lambert
            //0 ~ 1 사이로 잘라준다 
            //float ndotl = saturate(dot(s.Normal, lightDir));
            //float ndotl = max (0, dot(s.Normal, lightDir) );

            //half-lambert 
            float ndotl = saturate(dot(s.Normal, lightDir)) * 0.5 + 0.5;

            float4 final;
            //_LightColor0: 조명의 색상이나 강도저장된 내장변수 
            final.rgb = ndotl * s.Albedo * _LightColor0.rgb * atten;
            final.a = s.Alpha;

            return final;
        }

        ENDCG
    }
        FallBack "Diffuse"
}

 

빛 강조(Rim)

Shader "Custom/Test4"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _BumpMap("NormalMap", 2D) = "white" {}
        _RimColor("RimColor", Color) = (1,1,1,1)
        _RimPow("RimPow", Range(1, 10)) = 3
    }
        SubShader
        {
            Tags { "RenderType" = "Opaque" }

            CGPROGRAM
            #pragma surface surf Lambert //noambient

            sampler2D _MainTex;
            sampler2D _BumpMap;
            float4 _RimColor;
            float _RimPow;

            struct Input
            {
                float2 uv_MainTex;
                float2 uv_BumpMap;
                float3 viewDir;
            };

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

 

홀로그램

Shader "Custom/Holo"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
    }
        SubShader
    {
        Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }

        //https://docs.unity3d.com/kr/530/Manual/SL-Pass.html
        Pass{
            ColorMask 0
        }

        CGPROGRAM
        #pragma surface surf Lambert noambient alpha:fade

        sampler2D _MainTex;

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

        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            //o.Albedo = 0;//c.rgb;
            float ndotv = saturate(dot(o.Normal, IN.viewDir));
            o.Emission = float3(0, 1, 0);
            float rim = pow(1 - ndotv, 3) + pow(frac(IN.worldPos.g * 10 - _Time.y * 2), 3);// float3(0,1,0);    1.1 -> 0.1, 1.9->0.9   0 ~ 0.9
            o.Alpha = rim;
        }
        ENDCG
    }
        FallBack "Diffuse"
}

 

 

홀로그램 2

Shader "Custom/Holo"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _BumpMap("NormalMap", 2D) = "white" {}
        _RimPower("RimPower", Float) = 3
        _Interval("Interval", Range(0, 100)) = 0.0
        _Speed("Speed", Range(0, 10)) = 0.0
        _FracPower("FracPower", Float) = 3
    }
        SubShader
    {
        Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }

        Pass{
            ColorMask 0
        }

        CGPROGRAM
        #pragma surface surf Lambert noambient alpha:fade

        sampler2D _MainTex;
        float _RimPower;
        float _Interval;
        float _Speed;
        float _FracPower;

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

        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            //o.Albedo = 0;//c.rgb;
            //float ndotv = saturate(dot(o.Normal, IN.viewDir));
            o.Emission = float3(0, 1, 0);
            float rim = saturate(dot(o.Normal, IN.viewDir));
            rim = saturate(pow(1 - rim, _RimPower) * pow(frac(IN.worldPos.g * _Interval - _Time.y * _Speed), _FracPower) * 0.5);
            o.Alpha = rim;
        }
        ENDCG
    }
        FallBack "Diffuse"
}

 

blinnPhon

 

 

Shader "Custom/BlinnPhong"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _BumpMap("Normal Map", 2D) = "bump" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf _MyLambert

        sampler2D _MainTex;
        sampler2D _BumpMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

     

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

        float4 Lighting_MyLambert(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten) {

            float ndotl = dot(s.Normal, lightDir);
            float4 final;

            float3 H = normalize(lightDir + viewDir);
            float spec = saturate(dot(H, s.Normal));

            return spec;
           /* final.rgb = s.Albedo * ndotl;
            final.a = s.Alpha;
            return final;*/
        }

        ENDCG
    }
    FallBack "Diffuse"
}

 

blinnPhon Upgrade

Shader "Custom/BlinnPhong"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _BumpMap("Normal Map", 2D) = "bump" {}
        _SpecPow("Specular Power", Float) = 50.0
        _SpecCol("Specular Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf _Test noambient

        sampler2D _MainTex;
        sampler2D _BumpMap;
        float _SpecPow;
        float4 _SpecCol;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

     

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

        float4 Lighting_Test(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten) {

            //램버트 공식
            float ndotl = dot(s.Normal, lightDir);            

            //스패큘러 공식 적용
            float3 H = normalize(lightDir + viewDir);
            float spec = dot(H, s.Normal);
            spec = pow(spec, _SpecPow);
            
            //스패큘러 색상 적용, _SpecColor 내장 변수
            float3 specColor;
            specColor = spec * _SpecCol.rgb;

            //알베도 적용
            float4 final;
            final.rgb = (ndotl * s.Albedo) + specColor.rgb;
            final.a = s.Alpha;

            return spec;
           /* final.rgb = s.Albedo * ndotl;
            final.a = s.Alpha;
            return final;*/
        }

        ENDCG
    }
    FallBack "Diffuse"
}

Vertex

 

Shader "Custom/Vertex"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _Thickness("Line Thickness", Range(0.001, 0.01)) = 0.001
        _TintColor("Color", Color) = (1.0, 1.0, 1.0, 1.0)
        _BumpMap("NormalMap", 2D) = "bump" {}
        _Color("Color", Color) = (1,1,1,1)
        _Power("Power", Range(1, 10)) = 1
    }
        SubShader
        {
            Tags { "RenderType" = "Opaque" }
            LOD 200

            Cull Front

            CGPROGRAM
            #pragma surface surf _NoLight vertex:vert noshadow noambient

            sampler2D _MainTex;
            float _Thickness;
            float4 _TintColor;

            void vert(inout appdata_full v) {
                v.vertex.xyz = v.vertex.xyz + v.normal.xyz * _Thickness;

            }

            struct Input
            {
                float4 _TintColor: COLOR;
            };

            void surf(Input IN, inout SurfaceOutput o)
            {
                o.Albedo = IN._TintColor.rgb;
            }

            float4 Lighting_NoLight(SurfaceOutput s, float3 lightDir, float atten) {
                return float4(0, 0, 0, 1);
            }

            ENDCG

            Cull Back

                //2pass
                CGPROGRAM
                #pragma surface surf Lambert

                sampler2D _MainTex;
                sampler2D _BumpMap;
                float4 _Color;
                float _Power;

                struct Input {
                    float2 uv_MainTex;
                    float2 uv_BumpMap;
                    float3 viewDir;
                };

                void surf(Input IN, inout SurfaceOutput o) {
                    fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
                    o.Albedo = c.rgb;
                    o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                    
                    float rim = saturate(dot(o.Normal, IN.viewDir));
                    o.Emission = pow(1 - rim, _Power) * _Color.rgb;
                    o.Alpha = c.a;
                }
                ENDCG
        }
            FallBack "Diffuse"
}

Toon

Shader "Custom/Toon"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
    }
        SubShader
    {
        Tags{"RenderType" = "Opaque"}
        LOD 200

        CGPROGRAM
        #pragma surface surf _Toon noambient

        sampler2D _MainTex;

    struct Input
    {
        float2 uv_MainTex;
    };

    void surf(Input IN, inout SurfaceOutput o)
    {
        fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
        o.Albedo = c.rgb;
        o.Alpha = c.a;
    }

    float4 Lighting_Toon(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
    {
        //harf-lambert
        float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5;
        ndotl = ndotl * 5;
        ndotl = ceil(ndotl) / 5;

        //Rim
        float rim = abs(dot(s.Normal, viewDir));
        if (rim > 0.3)
        {
            rim = 1;
        }
        else
        {
            rim = 0;
        }

        float4 final;
        final.rgb = ndotl * s.Albedo * rim;
        final.a = s.Alpha;

        return rim;
    }
        ENDCG
    }
    FallBack "Diffuse"
}

Diffuse Warping

 

 

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RampTex ("Ramp Texture", 2D) = "white" {}
        _BumpMap ("Normal Map", 2D) = "bump" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf _Warp noambient

        sampler2D _MainTex;
        sampler2D _RampTex;
        sampler2D _BumpMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

        float4 Lighting_Warp(SurfaceOutput s, float3 lightDir, float atten){
            float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5;
            float4 ramp = tex2D(_RampTex, float2(ndotl, 0.5));

            float4 final;
            final.rgb = s.Albedo * ramp.rgb;
            final.a = s.Alpha;

            return final;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

Reflection

Shader "Custom/Reflector"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _BumpMap("NormalMap", 2D) = "white" {}
        _Cube("CubeMap", Cube) = ""{}
    }
    SubShader
    {
        Tags { "RenderType" = "Opaque" }
        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        sampler2D _BumpMap;
        samplerCUBE _Cube;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float3 worldRefl;
            INTERNAL_DATA
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            float4 re = texCUBE(_Cube, WorldReflectionVector(IN, o.Normal));

            o.Albedo = c.rgb * 0.5;
            o.Emission = re.rgb * 0.5;

            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}