You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.7 KiB
83 lines
2.7 KiB
3 years ago
|
using UnityEngine;
|
||
|
using System.Collections;
|
||
|
|
||
|
[ExecuteInEditMode]
|
||
|
|
||
|
class FogVolume : MonoBehaviour
|
||
|
{
|
||
|
GameObject VolumeObj;
|
||
|
Vector3 VolumeSize;
|
||
|
Material FogMaterial;
|
||
|
[SerializeField]
|
||
|
Color
|
||
|
InscatteringColor = Color.white, FogColor = new Color (.5f, .6f, .7f, 1);
|
||
|
[SerializeField]
|
||
|
float
|
||
|
Visibility = 5, InscateringExponent = 2, InscatteringIntensity = 2, InscatteringTransitionWideness = 1;
|
||
|
[SerializeField]
|
||
|
//[Range (0, 1)]
|
||
|
float
|
||
|
InscatteringStartDistance = 0;
|
||
|
[SerializeField]
|
||
|
Light
|
||
|
Sun;
|
||
|
[SerializeField]
|
||
|
int
|
||
|
DrawOrder = 0;
|
||
|
[SerializeField]
|
||
|
bool HideWireframe = true, EnableInscattering = false;
|
||
|
|
||
|
|
||
|
|
||
|
void OnEnable ()
|
||
|
{
|
||
|
if (!FogMaterial)
|
||
|
FogMaterial = new Material (Shader.Find ("Hidden/FogVolume"));
|
||
|
VolumeObj = this.gameObject;
|
||
|
VolumeObj.GetComponent<Renderer>().sharedMaterial = FogMaterial;
|
||
|
Camera.main.depthTextureMode |= DepthTextureMode.Depth;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
// Update is called once per frame
|
||
|
void Update ()
|
||
|
{
|
||
|
ToggleKeyword (EnableInscattering, "FOG_VOLUME_INSCATTERING_ON", "FOG_VOLUME_INSCATTERING_OFF");
|
||
|
#if UNITY_EDITOR
|
||
|
FogVolumeCreator.Wireframe (VolumeObj, HideWireframe);
|
||
|
#endif
|
||
|
FogMaterial.SetColor ("_Color", FogColor);
|
||
|
FogMaterial.SetColor ("_InscatteringColor", InscatteringColor);
|
||
|
|
||
|
if (Sun) {
|
||
|
InscatteringIntensity = Mathf.Max (0, InscatteringIntensity);
|
||
|
FogMaterial.SetFloat ("_InscatteringIntensity", InscatteringIntensity);
|
||
|
FogMaterial.SetVector ("L", -Sun.transform.forward);
|
||
|
}
|
||
|
InscateringExponent = Mathf.Max (1, InscateringExponent);
|
||
|
FogMaterial.SetFloat ("_InscateringExponent", InscateringExponent);
|
||
|
InscatteringTransitionWideness = Mathf.Max (1, InscatteringTransitionWideness);
|
||
|
FogMaterial.SetFloat ("InscatteringTransitionWideness", InscatteringTransitionWideness);
|
||
|
InscatteringStartDistance = Mathf.Max (0, InscatteringStartDistance);
|
||
|
FogMaterial.SetFloat ("InscatteringStartDistance", InscatteringStartDistance);
|
||
|
VolumeSize = VolumeObj.transform.lossyScale;
|
||
|
//bug fix. If the 3 axes values are equal, something gets broken :/
|
||
|
transform.localScale = new Vector3 ((float)decimal.Round ((decimal)VolumeSize.x, 2), VolumeSize.y, VolumeSize.z);
|
||
|
FogMaterial.SetVector ("_BoxMin", VolumeSize * -0.5051f);
|
||
|
FogMaterial.SetVector ("_BoxMax", VolumeSize * 0.5051f);
|
||
|
Visibility = Mathf.Max (0, Visibility);
|
||
|
FogMaterial.SetFloat ("_Visibility", Visibility);
|
||
|
GetComponent<Renderer>().sortingOrder = DrawOrder;
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
private static void ToggleKeyword (bool toggle, string keywordON, string keywordOFF)
|
||
|
{
|
||
|
Shader.DisableKeyword (toggle ? keywordOFF : keywordON);
|
||
|
Shader.EnableKeyword (toggle ? keywordON : keywordOFF);
|
||
|
}
|
||
|
}
|