summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-04-21 23:54:40 +0800
committerchai <chaifix@163.com>2021-04-21 23:54:40 +0800
commita0584b89d6d104929ad2845289c716aac096f8f4 (patch)
tree19c30b3772967eb4949f571db0bd3297993c1ca9
parenta8d3b504298902b9cc2c2392d221b0c10a652633 (diff)
+lensflare
-rw-r--r--Assets/LensFlare/Editor/FlareAtlasEditor.cs6
-rw-r--r--Assets/LensFlare/Flare Atlas.asset69
-rw-r--r--Assets/LensFlare/FlareAtlas.cs23
-rw-r--r--Assets/LensFlare/FlareBatch.cs88
-rw-r--r--Assets/LensFlare/FlareSource.cs55
-rw-r--r--Assets/LensFlare/LensFlare.unity69
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}