Created Lightning Gun effect (Uses LineRenderer, very slow) Created GPU Lightning renderer (very fast, still needs integration)
70 lines
2 KiB
C#
70 lines
2 KiB
C#
using UnityEngine;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using UnityEngine.Assertions;
|
|
|
|
public abstract class GPUTrailIndirect : GPUTrailBase
|
|
{
|
|
#region TypeDefine
|
|
public struct Trail
|
|
{
|
|
public float startTime;
|
|
public int totalInputNum;
|
|
}
|
|
|
|
|
|
public struct InputData
|
|
{
|
|
public Vector3 position;
|
|
public Color color;
|
|
}
|
|
#endregion
|
|
|
|
protected ComputeBuffer _inputBuffer;
|
|
ComputeBuffer _trailBuffer;
|
|
|
|
|
|
override protected void Awake()
|
|
{
|
|
base.Awake();
|
|
|
|
_trailBuffer = new ComputeBuffer(TrailNumMax, Marshal.SizeOf(typeof(Trail)));
|
|
_trailBuffer.SetData(Enumerable.Repeat(default(Trail), TrailNumMax).ToArray());
|
|
|
|
_inputBuffer = new ComputeBuffer(TrailNumMax, Marshal.SizeOf(typeof(InputData)));
|
|
}
|
|
|
|
override protected void ReleaseBuffer()
|
|
{
|
|
base.ReleaseBuffer();
|
|
if (_inputBuffer != null) _inputBuffer.Release();
|
|
if (_trailBuffer != null) _trailBuffer.Release();
|
|
}
|
|
|
|
const int NUM_THREAD_X = 32;
|
|
protected override void UpdateVertex()
|
|
{
|
|
// AddNode
|
|
SetCommonParameterForCs();
|
|
|
|
var success = UpdateInputBuffer();
|
|
if (success)
|
|
{
|
|
var kernel = Cs.FindKernel("AddNode");
|
|
Cs.SetBuffer(kernel, "_InputBuffer", _inputBuffer);
|
|
Cs.SetBuffer(kernel, "_TrailBufferW", _trailBuffer);
|
|
Cs.SetBuffer(kernel, "_NodeBufferW", nodeBuffer);
|
|
|
|
Cs.Dispatch(kernel, Mathf.CeilToInt((float)_trailBuffer.count / NUM_THREAD_X), 1, 1);
|
|
|
|
// CreateWidth
|
|
kernel = Cs.FindKernel("CreateWidth");
|
|
Cs.SetBuffer(kernel, "_TrailBuffer", _trailBuffer);
|
|
Cs.SetBuffer(kernel, "_NodeBuffer", nodeBuffer);
|
|
Cs.SetBuffer(kernel, "_VertexBuffer", vertexBuffer);
|
|
Cs.Dispatch(kernel, Mathf.CeilToInt((float)nodeBuffer.count / NUM_THREAD_X), 1, 1);
|
|
}
|
|
}
|
|
|
|
protected abstract bool UpdateInputBuffer();
|
|
}
|