最近在用unity的compute shader实现一些效果,遇到一个十分匪夷所思的bug,一开始以为自己写的有问题,但即使把shader改为最直接的采样,也仍然出现了这个问题,所以对这个问题做一个记录。 Compute shader计算得到的Texture尺寸不对 #pragma kernel SampleTextureTexture2D<float4>_InputTexture;RWTexture2D<float4>_OutputT...
ComputeShader程序通常需要将任意数据读取和写入内存缓冲区。 可以使用SystemInfo.supportsComputeShaders来查询是否支持缓冲区(具体与shader model的版本有关),这个函数的返回值是一个bool。 具体使用方法详见官方文档。 最常用的是RWStructuredBuffer<任意类型的数据、结构体>,RWTexture2D 调用compute shader 可以在c#脚本中...
Unity ComputeShader笔记 #pragmakernel CSMain //定义核心函数RWTexture2D<float4>Result;//这声明了一个变量,它包含的数据是shader程序将要用到的。我们不需要用到网格mesh数据,你需要像这样明确的声明,你的compute shader需要写入读出什么数据。数据类型名前面的“RW”指定了shader可以进行读写操作。 [numthreads(8...
RWTexture2D中,RW其实是Read和Write的意思,Texture2D就是二维纹理,因此它的意思就是一个可以被Compute Shader读写的二维纹理。 如果我们只想读不想写,那么可以使用Texture2D的类型。 我们知道纹理是由一个个像素组成的,每个像素都有它的下标,因此我们就可以通过像素的下标来访问它们,例如:Result[uint2(0,0)]。 ...
4、表面着色器—surface shader:包含 vertex 和 fragment 着色器的功能。 5、图像特效着色器—image-effect shader:实现屏幕特效,诸如抗锯齿、环境光遮蔽、模糊、溢光等。 6、计算着色器—compute shader:进行一些计算的着色器,实现诸如物理模拟、图像处理、光线追踪等。
在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)] ...
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(...
在Unity中,我们在Project中右键,即可创建出一个Compute Shader文件: 生成的文件属于一种Asset文件,并且都是以.compute作为文件后缀的。 我们来看下里面的默认内容: #pragma kernel CSMain RWTexture2D<float4> Result; [numthreads(8,8,1)] void CSMain (uint3 id : SV_DispatchThreadID) ...
2. 编写一个Compute Shader,用于实现二次立方插值算法来放大图片 下面是一个简单的Compute Shader示例,它实现了二次立方插值算法来放大图片: hlsl #pragma kernel CubicInterpolation RWTexture2D<float4> Result; Texture2D<float4> Source; int2 ResultSize; float4 cubicInterpolate(float2 uv, floa...
4)创建一个脚本ProceduralTextureGeneration.cs,拖拽到上步中的立方体中。 修改ProceduralTextureGeneration.cs 代码: [ExecuteInEditMode] public class ProceduralTextureGeneration : MonoBehaviour { //为了保存生成的程序纹理,我们声明了一个Texture2D类型的纹理变量 ...