栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

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

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 环境
  • 问题
  • Parallax 原理
    • GGB
  • 效果
  • 模拟闪电在云层中SSS
    • 测试脚本
    • 效果
    • GIF
  • Project
  • References


环境

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(lightning_prefab, null, false);
            lightningTrans = lightning.transform;
        }
        if (!lightning.activeSelf) lightning.SetActive(true);
        lightningTrans.position = positionWS;

        if (ps == null)
        {
            ps = lightning.GetComponentInChildren();
        }
        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 :

  • TestingMyFogOfWar_Parallax_Height_Fog_u3d_2019_4_30d1
  • HeightFog_CSharpAndShaderLab_Plus_with_Parallax
  • HeightFog_plus_optimize_noise
  • HeightFog_With_DummySSS_2022_04_15.shader
  • Height_Fog_Lightning_Test.unitypackage
  • Height_Fog_Lightning_Test_2022_04_22.unitypackage

References
  • Unity Shader PostProcessing - 11 - 雾效/深度雾效/高度雾/深度+高度雾
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号