环境
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 :
- 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