在前面:
(278条消息) Unity计算着色器 01_averagePerson的博客-CSDN博客
(278条消息) Unity计算着色器 02_averagePerson的博客-CSDN博客
了解了GPU里的一些概念,了解了unity里脚本应该怎么拖动,如何用计算着色器生成纹理。
但是如何用计算着色器来并行计算普通数据?
百度启动
原版:
Kyle Halladay - Getting Started With Compute Shaders In Unity
中文的:
Unity | 浅谈 Compute Shader - 十笔的文章 - 知乎
分两半吧,前一半是讲计算着色器生成纹理的,这里直接忽略。主要看后一半,后一半介绍的是如何并行计算普通数据。
举的是手动计算顶点变换的例子。
//C#脚本里需要声明一次
struct VecMatPair
{
public Vector3 point;
public Matrix4x4 matrix;
}//计算着色器脚本里也需要声明一次
struct VecMatPair
{float3 pos;float4x4 mat;
};
声明两次,可以猜一下,这是一对,一个出现在GPU,一个出现在CPU里。
好像是用来自定义数据的一个结构。大概长这样:
StructuctedBuffer floatBuffer;
RWStructuredBuffer readWriteIntBuffer;
大概是这样:
public ComputeShader shader;void RunShader()
{
VecMatPair[] data = new VecMatPair[5];
VecMatPair[] output = new VecMatPair[5];//同样的形式,为了取回结果//INITIALIZE DATA HEREComputeBuffer buffer = new ComputeBuffer(data.Length, 76);//变量的声明
buffer.SetData(data);//存
int kernel = shader.FindKernel("Multiply");
shader.SetBuffer(kernel, "dataBuffer", buffer);
shader.Dispatch(kernel, data.Length, 1,1);
buffer.GetData(output);//取
}
C#部分:
public ComputeShader shader;struct VecMatPair
{
public Vector3 point;
public Matrix4x4 matrix;
}void RunShader()
{
VecMatPair[] data = new VecMatPair[5];
VecMatPair[] output = new VecMatPair[5];//INITIALIZE DATA HEREComputeBuffer buffer = new ComputeBuffer(data.Length, 76);
buffer.SetData(data);
int kernel = shader.FindKernel("Multiply");
shader.SetBuffer(kernel, "dataBuffer", buffer);
shader.Dispatch(kernel, data.Length, 1,1);
buffer.GetData(output);
}
计算着色器部分:
#pragma kernel Multiplystruct VecMatPair
{float3 pos;float4x4 mat;
};RWStructuredBuffer dataBuffer;[numthreads(16,1,1)]
void Multiply (uint3 id : SV_DispatchThreadID)
{dataBuffer[id.x].pos = mul(dataBuffer[id.x].mat,float4(dataBuffer[id.x].pos, 1.0));
}
这样的例子挺好的,因为它比较纯,不涉及到其它的纹理啦,材质啦,脚本怎么拖啦,计算完如何再用着色器显示啦……就像安全模式一样。容易抓住主干,适合0基础的学习……