文章目录
前言
好久不见!今天使用Unity Compute Shader来实现一个大量正方体的随机颜色赋值,作为我的Unity ComputeShader入门练习。这个练习可以说很经典了。
Compute Shader的简单介绍
使用Compute Shader可以让GPU参与任意数据类型的运算,以此减小CPU的运算负荷。总所周知GPU十分擅长执行大量并行的简单算法,所以将此类运算交给GPU将能有效提升项目运行效率。Unity的Compute Shader使用的是HLSL书写。
你可以将Compute Shader当做C#脚本的一种延申,Compute Shader需要通过脚本来告诉它该什么时候执行以及如何执行。
Compute Shader在Editor中
你可以在Create -> Shader -> Compute Shader新建一个Compute Shader。
Unity Compute Shader代码原理简介
// Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain
// Create a RenderTexture with enableRandomWrite flag and set it
// with cs.SetTexture
RWTexture2D<float4> Result;
[numthreads(8,8,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
// TODO: insert actual code here!
Result[id.xy] = float4(id.x & id.y, (id.x & 15)/15.0, (id.y & 15)/15.0, 0.0);
}
这就是Compute Shader默认代码,你在里面先声明Compute Shader运行时(从C#里面Dispatch时)要调用的函数(#pragma kernel CSMain),kernel可以有很多个。用于和C#脚本传递数据的参数(这里是RWTexture2D,要处理任意数据一般使用StructuredBuffer类型),以及函数本身的定义(在这里他产生了一堆float4的数据,其实就是一张图),函数参数括号里面的东西是线程的ID。
此外,你还需要调整numthreads里的参数,这个玩意指定了Compute Shader会生成的线程数,需要根据情况设置,具体的我也不懂了,先保持默认。
函数内部的运算要尽可能简单,GPU不能很好的执行分支操作,所以也不要在里面做if之类的操作。
如果你对细节感兴趣,链接这篇老外写的文章能解释更多。
Getting Started With Compute Shaders In Unity
知乎中文翻译版:
Unity3d | 浅谈 Compute Shader
简书大佬教程
Unity Compute Shader入门初探
CPU对照组
为了体现Compute Shader的作用,我们先实现一个单纯使用CPU的对照组方法。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
struct Cube
{
public Vector3 position;
public Color color;
}
public class ComputeShaderDemo : MonoBehaviour
{
public int repetions;
public