这里详细的记载使用步骤,我这个例子是让一个立方体上下不停的动
创建一个compute shader 一个普通shader 一个材质 一个C#
先挨个写上类容
这里kernel 指定main函数入口,RWStructuredBuffer就是数组,具体size是在外部指定的,可能这里头也能grow吧,后面试试,但是感觉最好还是外部显式指定大小为好
入参那两个ID,是group和group内部的index
#pragma kernel UpdateOffset
struct OffsetData
{
float pos;
};
RWStructuredBuffer<OffsetData> OffsetBuffer;
float Time;
[numthreads(1, 1, 1)]
void UpdateOffset(uint3 gid : SV_GroupID, uint index : SV_GroupIndex)
{
int pindex = gid.x + index;
OffsetBuffer[pindex].pos += 0.01;
}
第二个普通shader只需要改这一点,把buffer读入,动一下position就行
然后是C#脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class cs : MonoBehaviour
{
private ComputeBuffer mPositionOffsetBuffer;
public ComputeShader computeShader;
public Material material;
int kernelId;
// Start is called before the first frame update
void Start()
{
mPositionOffsetBuffer = new ComputeBuffer(1, sizeof(float));
float[] arr = new float[1];
mPositionOffsetBuffer.SetData(arr);
kernelId = computeShader.FindKernel("UpdateOffset");
}
void UpdateBuffer()
{
computeShader.SetBuffer(kernelId, "OffsetBuffer", mPositionOffsetBuffer);
computeShader.Dispatch(kernelId, 1, 1, 1);
material.SetBuffer("_offsetDataBuffer", mPositionOffsetBuffer);
}
// Update is called once per frame
void Update()
{
if(mPositionOffsetBuffer != null)
{
UpdateBuffer();
}
}
void OnDisable()
{
if (mPositionOffsetBuffer != null)
mPositionOffsetBuffer.Release();
mPositionOffsetBuffer = null;
}
}
好了
在unity创建一个cube对象
把CS挂上,然后这2个赋值搞上去,CS之执行的时候才会操作这个材质和这个compute shader
再然后就把material拖给这个cube
点击play就可以了