From a0584b89d6d104929ad2845289c716aac096f8f4 Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 21 Apr 2021 23:54:40 +0800 Subject: +lensflare --- Assets/LensFlare/Editor/FlareAtlasEditor.cs | 6 +- Assets/LensFlare/Flare Atlas.asset | 69 ++++++++++++++-------- Assets/LensFlare/FlareAtlas.cs | 23 +++++++- Assets/LensFlare/FlareBatch.cs | 88 ++++++++++++++++++++++------- Assets/LensFlare/FlareSource.cs | 55 +++++++++++++++++- Assets/LensFlare/LensFlare.unity | 69 +++++++++++++++++++++- 6 files changed, 260 insertions(+), 50 deletions(-) (limited to 'Assets') diff --git a/Assets/LensFlare/Editor/FlareAtlasEditor.cs b/Assets/LensFlare/Editor/FlareAtlasEditor.cs index 8bcd05d..fb89409 100644 --- a/Assets/LensFlare/Editor/FlareAtlasEditor.cs +++ b/Assets/LensFlare/Editor/FlareAtlasEditor.cs @@ -34,7 +34,6 @@ public class FlareAtlasEditor : Editor FlareTexture subTex = m_SubTextures[i]; if (subTex == null) return; - EditorGUILayout.BeginHorizontal(); bool foldout = (m_Foldout & (1 << i)) != 0; foldout = EditorGUILayout.BeginFoldoutHeaderGroup(foldout, "Tex "+ i); @@ -106,7 +105,10 @@ public class FlareAtlasEditor : Editor } else { - m_SubTextures.Add(new FlareTexture()); + var tex = new FlareTexture(); + tex.Atlas = m_Atlas; + tex.ScaleOffset = new Vector4(1, 1, 0, 0); + m_SubTextures.Add(tex); } } if (GUI.changed) diff --git a/Assets/LensFlare/Flare Atlas.asset b/Assets/LensFlare/Flare Atlas.asset index 4ce890d..c151cb1 100644 --- a/Assets/LensFlare/Flare Atlas.asset +++ b/Assets/LensFlare/Flare Atlas.asset @@ -14,26 +14,49 @@ MonoBehaviour: m_EditorClassIdentifier: Atlas: {fileID: 2800000, guid: 539933a8761e97d41b8c1544e599872f, type: 3} SubTextures: - - ScaleOffset: {x: 0.3955078, y: 0.11230469, z: 0, w: 0.8876953} - - ScaleOffset: {x: 0.2524414, y: 0.23730469, z: 0, w: 0.63964844} - - ScaleOffset: {x: 0.24658203, y: 0.24316406, z: 0, w: 0.3852539} - - ScaleOffset: {x: 0.24316406, y: 0.2397461, z: 0, w: 0.13623047} - - ScaleOffset: {x: 0.12011719, y: 0.123535156, z: 0, w: 0} - - ScaleOffset: {x: 0.10986328, y: 0.123535156, z: 0.13623047, w: 0} - - ScaleOffset: {x: 0.24609375, y: 0.24609375, z: 0.25585938, w: 0.6347656} - - ScaleOffset: {x: 0.24316406, y: 0.2265625, z: 0.2524414, w: 0.40185547} - - ScaleOffset: {x: 0.23632812, y: 0.23583984, z: 0.25927734, w: 0.13964844} - - ScaleOffset: {x: 0.12011719, y: 0.12988281, z: 0.25927734, w: 0} - - ScaleOffset: {x: 0.123535156, y: 0.12695312, z: 0.38867188, w: 0} - - ScaleOffset: {x: 0.23632812, y: 0.24902344, z: 0.51171875, w: 0.75097656} - - ScaleOffset: {x: 0.23291016, y: 0.23632812, z: 0.5151367, w: 0.5048828} - - ScaleOffset: {x: 0.23242188, y: 0.24316406, z: 0.5151367, w: 0.24560547} - - ScaleOffset: {x: 0.23632812, y: 0.057128906, z: 0.5083008, w: 0.17919922} - - ScaleOffset: {x: 0.22607422, y: 0.017089844, z: 0.5214844, w: 0.15966797} - - ScaleOffset: {x: 0.20947266, y: 0.037109375, z: 0.5151367, w: 0.12939453} - - ScaleOffset: {x: 0.19970703, y: 0.18603516, z: 0.76416016, w: 0.81396484} - - ScaleOffset: {x: 0.18115234, y: 0.1743164, z: 0.7636719, w: 0.62841797} - - ScaleOffset: {x: 0.14990234, y: 0.12548828, z: 0.7602539, w: 0.4897461} - - ScaleOffset: {x: 0.12841797, y: 0.12207031, z: 0.76416016, w: 0.36132812} - - ScaleOffset: {x: 0.12890625, y: 0.118652344, z: 0.7636719, w: 0.23632812} - - ScaleOffset: {x: 0.083496094, y: 0.18115234, z: 0.9165039, w: 0.43408203} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.3955078, y: 0.11230469, z: 0, w: 0.8876953} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.2524414, y: 0.23730469, z: 0, w: 0.63964844} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.24658203, y: 0.24316406, z: 0, w: 0.3852539} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.24316406, y: 0.2397461, z: 0, w: 0.13623047} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.12011719, y: 0.123535156, z: 0, w: 0} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.11669922, y: 0.123535156, z: 0.13623047, w: 0} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.24609375, y: 0.24609375, z: 0.25585938, w: 0.6347656} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.24316406, y: 0.2265625, z: 0.2524414, w: 0.40185547} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.23632812, y: 0.23583984, z: 0.25927734, w: 0.13964844} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.12011719, y: 0.12988281, z: 0.25927734, w: 0} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.123535156, y: 0.12695312, z: 0.38867188, w: 0} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.23632812, y: 0.24902344, z: 0.51171875, w: 0.75097656} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.23291016, y: 0.23632812, z: 0.5151367, w: 0.5048828} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.23242188, y: 0.24316406, z: 0.5151367, w: 0.24560547} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.23632812, y: 0.057128906, z: 0.5083008, w: 0.17919922} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.22607422, y: 0.017089844, z: 0.5214844, w: 0.15966797} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.20947266, y: 0.037109375, z: 0.5151367, w: 0.12939453} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.19970703, y: 0.18603516, z: 0.76416016, w: 0.81396484} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.18115234, y: 0.1743164, z: 0.7636719, w: 0.62841797} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.14990234, y: 0.12548828, z: 0.7602539, w: 0.4897461} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.12841797, y: 0.12207031, z: 0.76416016, w: 0.36132812} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.12890625, y: 0.118652344, z: 0.7636719, w: 0.23632812} + - Atlas: {fileID: 11400000} + ScaleOffset: {x: 0.083496094, y: 0.18115234, z: 0.9165039, w: 0.43408203} diff --git a/Assets/LensFlare/FlareAtlas.cs b/Assets/LensFlare/FlareAtlas.cs index 9e42897..8f3efe2 100644 --- a/Assets/LensFlare/FlareAtlas.cs +++ b/Assets/LensFlare/FlareAtlas.cs @@ -6,7 +6,8 @@ using System; [Serializable] public class FlareTexture { - public Vector4 ScaleOffset; + public FlareAtlas Atlas; + public Vector4 ScaleOffset; public Vector2 Scale { get @@ -31,13 +32,31 @@ public class FlareTexture ScaleOffset.w = value.y; } } + public Vector2 PixelSize + { + get + { + if(Atlas != null) + return Scale * Atlas.PixelSize; + return Vector2.zero; + } + } } -[CreateAssetMenu(fileName = "Flare Atlas", menuName ="Rendering/New Flare Atlas", order=5)] +[CreateAssetMenu(fileName = "Flare Atlas", menuName = "Rendering/New Flare Atlas", order = 5)] public class FlareAtlas : ScriptableObject { public Texture2D Atlas; public List SubTextures; + public Vector2 PixelSize + { + get + { + if (Atlas != null) + return new Vector2(Atlas.width, Atlas.height); + return Vector2.zero; + } + } public Vector4 GetScaleOffset(int index) { diff --git a/Assets/LensFlare/FlareBatch.cs b/Assets/LensFlare/FlareBatch.cs index 06246db..101bc0b 100644 --- a/Assets/LensFlare/FlareBatch.cs +++ b/Assets/LensFlare/FlareBatch.cs @@ -2,6 +2,48 @@ using System.Collections.Generic; using UnityEngine; +internal struct Vertexhelper +{ + public Vector3[] vertices; + public int[] triangles; + public Vector2[] uv; + public Vertexhelper(int vertCount, int trisCount, int uvCount) + { + vertices = new Vector3[vertCount]; + triangles = new int[trisCount]; + uv = new Vector2[uvCount]; + } + public void FillMesh(Mesh outMesh) + { + outMesh.vertices = vertices; + outMesh.triangles = triangles; + outMesh.uv = uv; + } + public static void CombineAndFillMesh(IList meshes, Mesh outMesh) + { + int vertexCount = 0, trisCount = 0, uvCount = 0; + for(int i = 0; i < meshes.Count; ++i) + { + vertexCount += meshes[i].vertices.Length; + trisCount += meshes[i].triangles.Length; + uvCount += meshes[i].uv.Length; + } + Vertexhelper combinedMesh = new Vertexhelper(vertexCount, trisCount, uvCount); + int vi=0, ti = 0, uvi = 0; + for (int i = 0; i < meshes.Count; ++i) + { + Vertexhelper vh = meshes[i]; + foreach (int triangles in vh.triangles) + combinedMesh.triangles[ti++] = triangles + vi; + foreach (Vector3 vertex in vh.vertices) + combinedMesh.vertices[vi++] = vertex; + foreach (Vector2 uv in vh.uv) + combinedMesh.uv[uvi++] = uv; + } + combinedMesh.FillMesh(outMesh); + } +} + public class FlareBatch : MonoBehaviour { [SerializeField] private Camera m_FlareCamera; @@ -43,42 +85,50 @@ public class FlareBatch : MonoBehaviour void UpdateGeometry(FlareSource source) { Vector3 viewportPos = source.ViewportPosition; - Vector3 flareSpacePos = ViewportToFlareSpace(viewportPos); - + Vector2 center = Vector2.zero; // 光晕“中心”,后续这个值可以变 + Vector3 flareSpacePos = ViewportToFlareSpace(viewportPos); // 光源在flare space的坐标 + float angle = Mathf.Atan2(flareSpacePos.x, flareSpacePos.y) * Mathf.Rad2Deg; + List meshes = new List(); for (int i = 0; i < source.Flares.Count; ++i) { Flare flare = source.Flares[i]; - //Matrix4x4 translate = Matrix4x4.Translate(flareSpacePos); - Vector3[] vertices = + Vector2 size = source.GetFlareSize(flare); + Vector2 halfSize = size / 2; + Vertexhelper vh = new Vertexhelper(); + vh.vertices = new Vector3[] { - Vec3(-0.5f, -0.5f, 0), - Vec3(-0.5f, 0.5f, 0), - Vec3(0.5f, 0.5f, 0), - Vec3(0.5f, -0.5f, 0), + Vec3(-halfSize.x, -halfSize.y, 0), + Vec3(-halfSize.x, halfSize.y, 0), + Vec3(halfSize.x, halfSize.y, 0), + Vec3(halfSize.x, -halfSize.y, 0), }; - for (int j = 0; j < vertices.Length; ++j) + + Vector2 pos = Vector2.zero; + + for (int j = 0; j < vh.vertices.Length; ++j) { - vertices[j] += flareSpacePos; + vh.vertices[j] = Quaternion.Euler(0, 0, flare.Rotation) * vh.vertices[j]; + //vh.vertices[j] = Quaternion.Euler(0, 0, angle) * vh.vertices[j]; + //vh.vertices[j] += pos; } - Vector2[] uv = + vh.uv = new Vector2[] { Vec2(0,0), Vec2(0,1), Vec2(1,1), Vec2(1,0), }; - for(int j = 0; j < uv.Length; ++j) + for(int j = 0; j < vh.uv.Length; ++j) { Vector4 scaleOffset = flare.Atlas.GetScaleOffset(flare.Index); - uv[j] *= new Vector2(scaleOffset.x, scaleOffset.y); - uv[j] += new Vector2(scaleOffset.z, scaleOffset.w); + vh.uv[j] *= new Vector2(scaleOffset.x, scaleOffset.y); + vh.uv[j] += new Vector2(scaleOffset.z, scaleOffset.w); } - int[] triangles = { 0, 1, 2, 0, 2, 3 }; - m_Mesh.vertices = vertices; - m_Mesh.uv = uv; - m_Mesh.triangles = triangles; - // m_MeshFilter.mesh = m_Mesh; + vh.triangles = new int[] { 0, 1, 2, 0, 2, 3 }; + meshes.Add(vh); } + Vertexhelper.CombineAndFillMesh(meshes, m_Mesh); + m_MeshFilter.sharedMesh = m_Mesh; } void PopulateMesh() diff --git a/Assets/LensFlare/FlareSource.cs b/Assets/LensFlare/FlareSource.cs index 1ab8a2e..22c6dbb 100644 --- a/Assets/LensFlare/FlareSource.cs +++ b/Assets/LensFlare/FlareSource.cs @@ -6,8 +6,38 @@ using UnityEngine; [Serializable] public class Flare { - public FlareAtlas Atlas; - public int Index; + public FlareAtlas Atlas; // flare atlas + public int Index; // flare texture + public float MaxSize; // 最大,单位unit + public float MinSize = 0; // 最小,单位unit + public Color Color; // 颜色 + [Range(0, 360)] + public float Rotation; // 初始的旋转值,即正对着阳光时的姿势 + public bool OverridePixelPerUnit; // + public float PixelPerUnit; + + [Range(-5, 10)] + public float Distance = 0; // 一个相对于光源的偏移距离 + [HideInInspector] + public const float DistanceAmount = 15; + + public float DistanceAspect + { + get + { + return Distance / DistanceAmount; + } + } + + public FlareTexture Texture + { + get + { + if (Index < Atlas.SubTextures.Count) + return Atlas.SubTextures[Index]; + return null; + } + } } // 光源 @@ -15,6 +45,10 @@ public class FlareSource : MonoBehaviour { [SerializeField] private Camera m_GameCamera; [SerializeField] private Camera m_FlareCamera; + + public float PixelPerUnit = 100; // 用来控制缩放,在flare space生成网格的大小依据 + public AnimationCurve FadeInCurve; // 淡入的alpha曲线 + public AnimationCurve FadeOutCurve; // 淡出的alpha曲线 public List Flares; private Vector3 m_ViewportPosition; @@ -35,6 +69,8 @@ public class FlareSource : MonoBehaviour void Start() { IsVisible = false; + if (m_GameCamera == null) + m_GameCamera = Camera.main; } // Update is called once per frame @@ -55,6 +91,21 @@ public class FlareSource : MonoBehaviour } } + // 获取flare space下的初始大小,用来构建mesh + public Vector2 GetFlareSize(Flare flare) + { + Vector2 size = flare.Texture.PixelSize; + if(flare.OverridePixelPerUnit && flare.PixelPerUnit > 0) + { + size /= flare.PixelPerUnit; + } + else + { + size /= PixelPerUnit; + } + return size; + } + private void OnDrawGizmos() { Gizmos.DrawLine(transform.position, m_GameCamera.transform.position); diff --git a/Assets/LensFlare/LensFlare.unity b/Assets/LensFlare/LensFlare.unity index e648119..ac972fd 100644 --- a/Assets/LensFlare/LensFlare.unity +++ b/Assets/LensFlare/LensFlare.unity @@ -433,9 +433,74 @@ MonoBehaviour: m_EditorClassIdentifier: m_GameCamera: {fileID: 2134045979} m_FlareCamera: {fileID: 1380528559} + PixelPerUnit: 500 + FadeInCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + FadeOutCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 34 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 Flares: - Atlas: {fileID: 11400000, guid: 317e5903581b97148afb8a08854d474d, type: 2} - Index: 0 + Index: 22 + MaxSize: 0 + MinSize: 0 + Color: {r: 1, g: 1, b: 1, a: 1} + Rotation: 270 + OverridePixelPerUnit: 1 + PixelPerUnit: 700 + Distance: 0 + - Atlas: {fileID: 11400000, guid: 317e5903581b97148afb8a08854d474d, type: 2} + Index: 3 + MaxSize: 0 + MinSize: 0 + Color: {r: 1, g: 1, b: 1, a: 1} + Rotation: 270 + OverridePixelPerUnit: 1 + PixelPerUnit: 700 + Distance: 0 --- !u!1 &1129909397 GameObject: m_ObjectHideFlags: 0 @@ -796,7 +861,7 @@ BoxCollider: m_GameObject: {fileID: 1607455291} m_Material: {fileID: 0} m_IsTrigger: 0 - m_Enabled: 1 + m_Enabled: 0 serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} -- cgit v1.1-26-g67d0