diff options
author | chai <chaifix@163.com> | 2021-04-21 23:54:40 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-04-21 23:54:40 +0800 |
commit | a0584b89d6d104929ad2845289c716aac096f8f4 (patch) | |
tree | 19c30b3772967eb4949f571db0bd3297993c1ca9 | |
parent | a8d3b504298902b9cc2c2392d221b0c10a652633 (diff) |
+lensflare
-rw-r--r-- | Assets/LensFlare/Editor/FlareAtlasEditor.cs | 6 | ||||
-rw-r--r-- | Assets/LensFlare/Flare Atlas.asset | 69 | ||||
-rw-r--r-- | Assets/LensFlare/FlareAtlas.cs | 23 | ||||
-rw-r--r-- | Assets/LensFlare/FlareBatch.cs | 88 | ||||
-rw-r--r-- | Assets/LensFlare/FlareSource.cs | 55 | ||||
-rw-r--r-- | Assets/LensFlare/LensFlare.unity | 69 |
6 files changed, 260 insertions, 50 deletions
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<FlareTexture> 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<Vertexhelper> 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<Vertexhelper> meshes = new List<Vertexhelper>();
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<Flare> 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} |