最终效果
思路
图解ComputeShader
这个图片就是ComputeShader,值得注意的是Thread最多为1024个。应该是考虑到当前显卡的最低线程数的关系。
数据交换的效率
有图可鉴,数据最好是单向输出的,尽量避免交换。
网格实例化思路
- 脚本中根据核心数对需要实例化的网格进行顶点排序并记录在uv信息中,然后合并网格,也可以利用dx11的SV_InstanceID(相关API可以查看MSCN的HLSL)。
- 编写ComputeShader,利用GPU对大量数据进行实时运算。
- 编写延迟光照Shader,根据处理后的数据对网格进行实时变动。
源代码
脚本控制代码
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using UnityEngine.Assertions;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace MatrixParticle
{
public struct _Particle
{
Vector3 position;
Vector3 direction;
Vector3 scale;
Vector2 uv;
Vector4 color;
float lifeTime;
};
public class MatrixParticles : MonoBehaviour
{
const int VERTEX_MAX = 65534;
public ComputeShader shader;
public Material mat;
public Mesh mesh;
[SerializeField]
private int xMod = 1, yMod = 1, zMod = 1;
[SerializeField]
private Vector3 scale = Vector3.one;
private ComputeBuffer particlesBuffer;
private int initKernal, updateKernal, emitKernal;
private int maxKernal;
private List<MaterialPropertyBlock> propertyBlocks = new List<MaterialPropertyBlock>();
private int perMeshNum, comMeshNum;
private Mesh combinedMesh;
void Start()
{
maxKernal = xMod * yMod * zMod * 1000;
shader.SetInt("_xMod", xMod * 10);
shader.SetInt("_yMod", yMod * 10);
shader.SetInt("_zMod