Aetheria/Assets/Plugins/GPUTrail/GPUTrailIndirect.cs
Reinier Vens bb297bf84c Lightning
Created Lightning Gun effect (Uses LineRenderer, very slow)
Created GPU Lightning renderer (very fast, still needs integration)
2021-02-04 04:37:47 +00:00

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();
}