정점 애니메이션과 림 라이트를 조합하면 좋은 느낌이었다

17151 단어 ShaderUnity

소개



내 생각에 따라 여러 가지 놀 수있는 표현이었기 때문에 시어
안심과 신뢰의 Made With Unity

셰이더



제목대로 간단한 정점 애니메이션과 림 라이트를 가산 합성해 버리는 셰이더입니다
Camera의 ClearFlags를 Skybox로 하면 비치지 않게 되어 버리는 (뭔가 이상하다) 때문에 SolidColor로 해 주세요

Albedo라든지 Alpha에 아무것도 넣지 않기 때문인가...?

Yurayura.shader
Shader "Custom/Yurayura"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _Color("Color", Color) = (1, 1, 1, 1)
        _Amplitude("Amplitude", float) = 1.0
        _RimPower("RimPower", Range(0.1, 10.0)) = 3.0
    }

    SubShader
    {
        Tags{ "RenderType"="Transparent" "Queue"="Transparent" }
        Blend One One
        Cull Back
        ZWrite Off

        CGPROGRAM
        #pragma surface surf Lambert vertex:vert
        #pragma target 3.0      
        #include "Noise.cginc"

        sampler2D _MainTex;
        float _Amplitude;
        float4 _Color;
        half _RimPower;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;
        };

        void vert(inout appdata_full v)
        {
            v.vertex.xyz += v.normal * _Amplitude * perlin(v.vertex.xyz * _Time.y);
        }

        void surf(Input IN, inout SurfaceOutput o)
        {
            float rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
            float3 rimColor = pow(rim, _RimPower);
            o.Emission = tex2D(_MainTex, IN.uv_MainTex).rgb * rimColor * _Color;
        }

        ENDCG
    }
    Fallback "Diffuse"
}

Noise.cginc
float rand(float2 co) 
{
    return frac(sin(dot(co.xy, float2(12.9898, 78.233))) * 43758.5453);
}

float rand(float3 co)
{
    return frac(sin(dot(co.xyz, float3(12.9898, 78.233, 56.787))) * 43758.5453);
}

float noise(float3 pos)
{
    float3 ip = floor(pos);
    float3 fp = smoothstep(0, 1, frac(pos));
    float4 a = float4(
        rand(ip + float3(0, 0, 0)),
        rand(ip + float3(1, 0, 0)),
        rand(ip + float3(0, 1, 0)),
        rand(ip + float3(1, 1, 0)));
    float4 b = float4(
        rand(ip + float3(0, 0, 1)),
        rand(ip + float3(1, 0, 1)),
        rand(ip + float3(0, 1, 1)),
        rand(ip + float3(1, 1, 1)));
    a = lerp(a, b, fp.z);
    a.xy = lerp(a.xy, a.zw, fp.y);
    return lerp(a.x, a.y, fp.x);
}

float perlin(float3 pos) {
    return  (noise(pos) * 32 +
            noise(pos * 2 ) * 16 +
            noise(pos * 4) * 8 +
            noise(pos * 8) * 4 +
            noise(pos * 16) * 2 +
            noise(pos * 32) ) / 63;
}

Noise 같은 함수군은 cginc에 정리해 버리면 편리하네요

우선 스피어에 페타하면 이런 느낌이 든다

움직이는 것도 ◯와 공처럼 되었습니다만, 조금 맛이 없기 때문에 조금 조정해 드리겠습니다


Material을 이렇게 하면

상당히 귀여워졌습니다.

이렇게 할 수 있습니다.



불꽃의 고리 같은





Sphere를 3개 겹쳐 각각 Rotation만 즐겁게 해주면 이런 느낌이 된다

결정처럼





Amplitude를 부의 값으로 하면 이런 느낌이 듭니다.

적당히 텍스처 넣어 보자





Sphere2 겹쳐서. 다채로운 텍스처를 넣으면 활기차다.

믿을 수 있니? 이것 전부 스피어야...




PostProcessingStack 자산을 넣고 Bloom을 넣으면 더 깨끗해질 것 같습니다.

좋은 웹페이지 즐겨찾기