Unity Shader - Post Processing 15 - Height Fog (Plus) - 后效 高度雾 改进版 (Parallax)、模拟闪电在云层中SSS

141 篇文章 35 订阅
49 篇文章 0 订阅


环境

Unity : 2018.2.11f1, 2019.4.30f1
Pipeline : Built-in RP
Graphic API : DX / OpenGL ES


之前 使用 后效实现过:深度 + 高度雾 版本的效果,具体可以参考:Unity Shader PostProcessing - 11 - 雾效/深度雾效/高度雾/深度+高度雾


问题

因为之前写的高度雾会有一个问题:不论我的高度雾设置多高的雾

底下的 Geometry (集合体)的轮廓仍然可以看见,如下图:
在这里插入图片描述

下面是未优化前的 GIF 动画:
在这里插入图片描述

下面是优化后的 GIF 动画:
在这里插入图片描述


Parallax 原理

在这里插入图片描述


GGB

后续补充


效果

最终能实现什么效果?

请添加图片描述
(GIF 将图像压缩太残了。。。-_-!)


模拟闪电在云层中SSS

2022/04/15 - 因需求添加了一下闪电时,在高度雾模拟的 SSS 效果


测试脚本

// jave.lin 2022/04/19
// 测试 高度雾中的闪电效果的 脚本

using DG.Tweening;
using UnityEngine;

public class LightningInfo
{
    public Vector3 positionWS;
    public float intensity;
    public GameObject lightning;

    private float startIntensity;
    private ParticleSystem ps;
    private Transform lightningTrans;

    public void Run(GameObject lightning_prefab)
    {
        positionWS = new Vector3(Random.Range(-100f, 100f), 15.0f, Random.Range(-300f, 300f));
        if (lightning == null)
        {
            lightning = GameObject.Instantiate<GameObject>(lightning_prefab, null, false);
            lightningTrans = lightning.transform;
        }
        if (!lightning.activeSelf) lightning.SetActive(true);
        lightningTrans.position = positionWS;

        if (ps == null)
        {
            ps = lightning.GetComponentInChildren<ParticleSystem>();
        }
        if (ps != null)
        {
            ps.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);
            ps.Play(true);
        }

        startIntensity = Random.Range(0.5f, 1.0f);
        intensity = 0.0f;
        var tween = DOTween.To(() => startIntensity, (v) => { intensity = v; startIntensity = v; }, 0.0f, 0.3f);

        tween.OnStart(() =>
        {
            intensity = startIntensity;
        });
        tween.SetDelay(0.1f);

        if (ps != null)
        {
            tween.OnComplete(() =>
            {
                ps.Stop(true, ParticleSystemStopBehavior.StopEmitting);
            });
        }
    }
}

public class TestHeightFogLightningScript : MonoBehaviour
{
    private static int _LightningPos = Shader.PropertyToID("_LightningPos");
    private static int _LightningIntensity = Shader.PropertyToID("_LightningIntensity");

    public Material hf_mat;
    public GameObject lightning_prefab;
    [Range(1, 5)]
    public int lightningMax = 2;
    [Range(0.0f, 100.0f)]
    public float lightningRate = 0.2f;

    private LightningInfo[] lightningInfos;

    private Vector4[] positionWS_arr;
    private float[] intensity_arr;
    private bool lightning_enabled = true;

    private void Start()
    {
        lightningInfos = new LightningInfo[5];
        positionWS_arr = new Vector4[5];
        intensity_arr = new float[5];
    }

    private void Update()
    {
        for (int i = 0; i < lightningInfos.Length; i++)
        {
            var info = lightningInfos[i];
            if (info == null) continue;
            positionWS_arr[i] = info.positionWS;
            intensity_arr[i] = info.intensity;
        }
        hf_mat.SetVectorArray(_LightningPos, positionWS_arr);
        hf_mat.SetFloatArray(_LightningIntensity, intensity_arr);

        LightningHandler();
    }

    private void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 300, 30), lightning_enabled ? "Click To Disabled Lightning" : "Click To Enabled Lightning"))
        {
            lightning_enabled = !lightning_enabled;
        }
    }

    private void LightningHandler()
    {
        if (lightning_enabled)
        {
            for (int i = 0; i < lightningMax; i++)
            {
                var info = lightningInfos[i];
                if (info == null)
                {
                    info = new LightningInfo();
                    lightningInfos[i] = info;
                }
                if (info.intensity <= 0 && Random.Range(0.0f, 100.0f) > (100.0f - lightningRate))
                {
                    info.Run(lightning_prefab);
                }
            }
        }
    }
}

效果

在这里插入图片描述


GIF

(GIF 会把图压残了,实际效果会更好)

下面是高度雾添加了闪电之后的效果搭配效果
请添加图片描述

下面是没有高度雾闪电的效果(之后,闪电特效),档次完全不一样
请添加图片描述

将 雾效参数调整,并将 雾效浓度(不透明度)为:0.9
请添加图片描述

将 雾效浓度(不透明度)为:1.0 (完全不透明)
请添加图片描述


Project

backup :


References

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值