unity 使用 compute shader的步骤

这里详细的记载使用步骤,我这个例子是让一个立方体上下不停的动

创建一个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把shader
在这里插入图片描述

再然后就把material拖给这个cube
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
点击play就可以了

猜你喜欢

转载自blog.csdn.net/qq_35158695/article/details/141159384