using System.IO; using UnityEngine; using UnityEditor; public class GenerateTextures : MonoBehaviour { private static readonly int kTextureSize = 1024; private static readonly float kQuadraticFac = 25.0f; private static readonly float kToZeroFadeStart = 0.8f * 0.8f; private static readonly string kSavePath = "Assets/ScriptableRenderPipeline/LightweightPipeline/Textures/LightweightLightAttenuation.png"; [MenuItem("RenderPipeline/LightweightPipeline/GenerateLightFalloffTexture")] public static void GenerateLightFalloffTexture() { Texture2D tex = new Texture2D(kTextureSize, 4, TextureFormat.Alpha8, false, true); tex.wrapMode = TextureWrapMode.Clamp; byte[] bytes = new byte[kTextureSize * 4]; for (int x = 0; x < kTextureSize; ++x) { float sqrRange = (float) x/(float) kTextureSize; byte atten = LightAttenuationNormalized(sqrRange); bytes[x] = atten; bytes[x + kTextureSize] = atten; bytes[x + kTextureSize * 2] = atten; bytes[x + kTextureSize * 3] = atten; } tex.LoadRawTextureData(bytes); tex.Apply(false); SaveTexture(tex); } public static void SaveTexture(Texture2D tex) { byte[] bytes = tex.EncodeToPNG(); File.WriteAllBytes(kSavePath, bytes); } public static byte LightAttenuationNormalized(float distSqr) { // 1 / 1.0 + quadAtten * distSqr attenuation function float atten = 1.0f / (1.0f + CalculateLightQuadFac(1.0f) * distSqr); // however the above does not falloff to zero at light range. // Start fading from ktoZeroFadeStart to light range float fadeMultiplier = Mathf.Clamp01((distSqr - 1.0f) / (kToZeroFadeStart - 1.0f)); atten *= fadeMultiplier; //return atten; return (byte)Mathf.RoundToInt(atten * (float)byte.MaxValue); } public static float CalculateLightQuadFac(float range) { return kQuadraticFac / (range * range); } }