HolyFot

Fog Volume Noise Unity HDRP

May 26th, 2020
72
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Fog WhiteNoise Script, Automatically Generates White Noise into a Fog Volume
  2. //Couldn't get Perlin to scale/work right. I would really love higher 3d texture resolutions.
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using UnityEngine.Rendering;
  7. using UnityEngine.Rendering.HighDefinition;
  8.  
  9. [ExecuteInEditMode]
  10. [RequireComponent(typeof(DensityVolume))]
  11. public class FogNoise : MonoBehaviour
  12. {
  13.     public bool WhiteNoise = true;
  14.     public bool Perlin = true;
  15.     public bool heightGradient = true;
  16.     public bool Clamping = false;
  17.     //public bool Billow = true;
  18.  
  19.     private bool lastWhiteNoise = true;
  20.     private bool lastPerlin = true;
  21.     private bool lastHeightGradient = true;
  22.     private bool lastClamping = true;
  23.     Texture3D texture;
  24.  
  25.     void Awake()
  26.     {
  27.         Generate3dNoise();
  28.  
  29.         lastWhiteNoise = WhiteNoise; //Save Current Values
  30.         lastPerlin = Perlin;
  31.         lastHeightGradient = heightGradient;
  32.         lastClamping = Clamping;
  33.     }
  34.  
  35.     void Update()
  36.     {
  37.         bool dirty = false;
  38.         if (lastWhiteNoise != WhiteNoise)
  39.             dirty = true;
  40.         if (lastPerlin != Perlin)
  41.             dirty = true;
  42.         if (lastHeightGradient != heightGradient)
  43.             dirty = true;
  44.         if (lastClamping != Clamping)
  45.             dirty = true;
  46.  
  47.         if (dirty) //If values changed, Regenerate
  48.         {
  49.             Generate3dNoise();
  50.             lastWhiteNoise = WhiteNoise; //Save Current Values
  51.             lastPerlin = Perlin;
  52.             lastHeightGradient = heightGradient;
  53.             lastClamping = Clamping;
  54.         }
  55.  
  56.         //Update Wind Direction (TODO)
  57.     }
  58.  
  59.     public void Generate3dNoise()
  60.     {
  61.         texture = CreateTexture3D(32);
  62.         DensityVolume densityVolume = GetComponent<DensityVolume>();
  63.         densityVolume.parameters.volumeMask = texture;
  64.         //Debug.Log("Generated New Fog Noise.");
  65.     }
  66.  
  67.     Texture3D CreateTexture3D(int size)
  68.     {
  69.         Color[] colorArray = new Color[size * size * size];
  70.         texture = new Texture3D(size, size, size, TextureFormat.Alpha8, true);
  71.         for (int x = 0; x < size; x++)
  72.         {
  73.             for (int y = 0; y < size; y++)
  74.             {
  75.                 for (int z = 0; z < size; z++)
  76.                 {
  77.                     float f = 0f;
  78.  
  79.                     if (Perlin)
  80.                     {
  81.                         f = Mathf.PerlinNoise(y, z);
  82.  
  83.                         if (WhiteNoise)
  84.                             f = Mathf.Lerp(Random.Range(0f, 1f), f, 0.5f); //White Noise
  85.                     }
  86.                     else
  87.                     {
  88.                         if (WhiteNoise) //Just White Noise
  89.                             f = Random.Range(0f, 1f);
  90.                     }
  91.  
  92.                     if (Clamping) //Only White/Transparent
  93.                         f = (f <= 0.5f) ? 1f : 0f;
  94.  
  95.                     if (heightGradient)
  96.                     {
  97.                         f = (float)(y / size) * 2f;
  98.                     }
  99.  
  100.                     Color c = new Color(1.0f, 1.0f, 1.0f, f);
  101.                     colorArray[x + (y * size) + (z * size * size)] = c;
  102.                 }
  103.             }
  104.         }
  105.  
  106.         //Height Gradient
  107.         /*if (heightGradient)
  108.         {
  109.             for (int x = 0; x < size; x++)
  110.             {
  111.                 for (int z = 0; z < size; z++)
  112.                 {
  113.                     for (int y = 0; y < size; y++)
  114.                     {
  115.                         float alpha = colorArray[x + (y * size) + (z * size * size)].a;
  116.                         colorArray[x + (y * size) + (z * size * size)].a = (float) (y / size); //Mathf.Lerp(0f, 1f, y/size);
  117.                     }
  118.                 }
  119.             }
  120.         }*/
  121.        
  122.  
  123.         texture.SetPixels(colorArray);
  124.         texture.Apply();
  125.         return texture;
  126.     }
  127. }
RAW Paste Data