97 lines
3.7 KiB
C#
97 lines
3.7 KiB
C#
using UnityEngine.Experimental.Rendering;
|
|
|
|
namespace UnityEngine.Rendering.Universal
|
|
{
|
|
internal static class Light2DLookupTexture
|
|
{
|
|
private static Texture2D s_PointLightLookupTexture;
|
|
|
|
public static Texture GetLightLookupTexture()
|
|
{
|
|
if (s_PointLightLookupTexture == null)
|
|
s_PointLightLookupTexture = CreatePointLightLookupTexture();
|
|
return s_PointLightLookupTexture;
|
|
}
|
|
|
|
private static Texture2D CreatePointLightLookupTexture()
|
|
{
|
|
const int WIDTH = 256;
|
|
const int HEIGHT = 256;
|
|
|
|
var textureFormat = GraphicsFormat.R8G8B8A8_UNorm;
|
|
if (RenderingUtils.SupportsGraphicsFormat(GraphicsFormat.R16G16B16A16_SFloat, FormatUsage.SetPixels))
|
|
textureFormat = GraphicsFormat.R16G16B16A16_SFloat;
|
|
else if (RenderingUtils.SupportsGraphicsFormat(GraphicsFormat.R32G32B32A32_SFloat, FormatUsage.SetPixels))
|
|
textureFormat = GraphicsFormat.R32G32B32A32_SFloat;
|
|
|
|
var texture = new Texture2D(WIDTH, HEIGHT, textureFormat, TextureCreationFlags.None);
|
|
texture.filterMode = FilterMode.Bilinear;
|
|
texture.wrapMode = TextureWrapMode.Clamp;
|
|
var center = new Vector2(WIDTH / 2.0f, HEIGHT / 2.0f);
|
|
|
|
for (var y = 0; y < HEIGHT; y++)
|
|
{
|
|
for (var x = 0; x < WIDTH; x++)
|
|
{
|
|
var pos = new Vector2(x, y);
|
|
var distance = Vector2.Distance(pos, center);
|
|
var relPos = pos - center;
|
|
var direction = center - pos;
|
|
direction.Normalize();
|
|
|
|
// red = 1-0 distance
|
|
// green = 1-0 angle
|
|
// blue = direction.x
|
|
// alpha = direction.y
|
|
|
|
float red;
|
|
if (x == WIDTH - 1 || y == HEIGHT - 1)
|
|
red = 0;
|
|
else
|
|
red = Mathf.Clamp(1 - (2.0f * distance / WIDTH), 0.0f, 1.0f);
|
|
|
|
var cosAngle = Vector2.Dot(Vector2.down, relPos.normalized);
|
|
var angle = Mathf.Acos(cosAngle) / Mathf.PI; // 0-1
|
|
|
|
var green = Mathf.Clamp(1 - angle, 0.0f, 1.0f);
|
|
var blue = direction.x;
|
|
var alpha = direction.y;
|
|
|
|
var color = new Color(red, green, blue, alpha);
|
|
|
|
texture.SetPixel(x, y, color);
|
|
}
|
|
}
|
|
texture.Apply();
|
|
return texture;
|
|
}
|
|
|
|
// private static Texture2D s_FalloffLookupTexture;
|
|
//#if UNITY_EDITOR
|
|
// [MenuItem("Light2D Debugging/Write Light Texture")]
|
|
// static public void WriteLightTexture()
|
|
// {
|
|
// var path = EditorUtility.SaveFilePanel("Save texture as PNG", "", "LightLookupTexture.exr", "png");
|
|
|
|
// CreatePointLightLookupTexture();
|
|
|
|
// byte[] imgData = s_PointLightLookupTexture.EncodeToEXR(Texture2D.EXRFlags.CompressRLE);
|
|
// if (imgData != null)
|
|
// File.WriteAllBytes(path, imgData);
|
|
// }
|
|
|
|
// [MenuItem("Light2D Debugging/Write Falloff Texture")]
|
|
// static public void WriteCurveTexture()
|
|
// {
|
|
// var path = EditorUtility.SaveFilePanel("Save texture as PNG", "", "FalloffLookupTexture.png", "png");
|
|
|
|
// CreateFalloffLookupTexture();
|
|
|
|
// byte[] imgData = s_FalloffLookupTexture.EncodeToPNG();
|
|
// if (imgData != null)
|
|
// File.WriteAllBytes(path, imgData);
|
|
// }
|
|
//#endif
|
|
}
|
|
}
|