查看Unity官方文档,可以看到Unity“偷偷”把我们的Texture分辨率进行了压缩,在常用渲染管线用的shader中我们一直用uv去采样Texture,因此一般不会太直观的感受到这个问题。但在compute shader中,直接按照Texture原本的分辨率去访问了被压缩后结果的对应像素,比如测试用的1024x2048的贴图被压缩为了512x1024,因此在512x1024以外...
Create(); kernal = computeShader.FindKernel("CSMain"); material.SetTexture("_BaseMap", texture); } void Update() { SetupComputeShader(); } private void SetupComputeShader() { computeShader.SetTexture(kernal, "Result", texture); computeShader.Dispatch(kernal, 32, 32, 1); } } Compute...
上图就是我们Unity默认生成的Compute Shader代码所能带来的效果,我们也可试下用它处理2048*2048的Texture,也是非常快的。 接下来我们再来看看粒子效果的例子: 首先一个粒子通常拥有颜色和位置两个属性,并且我们肯定是要在Compute Shader里去处理这两个属性的,那么我们就可以在Compute Shader创建一个struct来存储: struct...
Compute shader事实上需要被设置并调用在脚本上,如下: publicComputeShader shader;voidRunShader() {int kernelHandle = shader.FindKernel("CSMain");RenderTexture tex =newRenderTexture(256,256,24);tex.enableRandomWrite = true;tex.Create();shader.SetTexture(kernelHandle,"Result", tex);shader.Dispatch(ke...
在Unity中,我们在Project中右键,即可创建出一个Compute Shader文件: 生成的文件属于一种Asset文件,并且都是以.compute作为文件后缀的。 我们来看下里面的默认内容: 1 2 3 4 5 6 7 8 9 #pragma kernel CSMain RWTexture2D<float4> Result; [numthreads(8,8,1)] ...
Unity ComputeShader笔记 #pragmakernel CSMain //定义核心函数RWTexture2D<float4>Result;//这声明了一个变量,它包含的数据是shader程序将要用到的。我们不需要用到网格mesh数据,你需要像这样明确的声明,你的compute shader需要写入读出什么数据。数据类型名前面的“RW”指定了shader可以进行读写操作。
在Unity中,我们在Project中右键,即可创建出一个Compute Shader文件: 生成的文件属于一种Asset文件,并且都是以.compute作为文件后缀的。 我们来看下里面的默认内容: #pragma kernel CSMain RWTexture2D<float4> Result; [numthreads(8,8,1)] void CSMain (uint3 id : SV_DispatchThreadID) ...
又因为贴图的Mip level在compute shader中没有定义,因此无法将线程数匹配到具体像素,必须自己定义Mip level,所以使用Texture.SampleLevel 或者 Texture.Load 来采样,几何着色器和顶点着色器同理。 Example 我们首先在C#脚本中和Shader中定义同样的结构体 public struct MyInstance{ ...
ComputeShader.SetTexture public void SetTexture (int kernelIndex, string name, Texture texture); public void SetTexture (int kernelIndex, int nameID, Texture texture); public void SetTexture (int kernelIndex, string name, Texture texture, int mipLevel); public void SetTexture (int kernel...
shader.SetInt("quadSize",quadSize);shader.Dispatch(kernelHandle,size/8,size/8,1);specialPointsBuff.Dispose();Color[]pointDatas=newColor[colorBuff.count];colorBuff.GetData(pointDatas);colorBuff.Dispose();Texture2Dtexture2D=newTexture2D(size,size,TextureFormat.ARGB32,false);texture2D.SetPixels(...