Compute Shaders are programs that run on the graphics card, outside of the normal rendering pipeline. They can be used for massively parallel GPGPU algorithms, or to accelerate parts of game rendering. In order to efficiently use them, often an in-depth knowledge of GPU architectures and parallel algorithms is needed; as well as knowledge of DirectCompute, OpenCL or CUDA.
Compute shaders in Unity are built on top of DirectX 11 DirectCompute technology; and currently require Windows Vista or later and a GPU capable of Shader Model 5.0.
Similar to normal shaders, Compute Shaders are asset files in your project, with *.compute
file extension. They are written in DirectX 11 style HLSL language, with minimal amount of #pragma
compilation directives to indicate which functions to compile as compute shader kernels.
Here's a minimal example of a compute shader file:
// test.compute #pragma kernel FillWithRed RWTexture2D<float4> res; [numthreads(1,1,1)] void FillWithRed (uint3 dtid : SV_DispatchThreadID) { res[dtid.xy] = float4(1,0,0,1); }
The example above does not do anything remotely interesting, just fills output texture with red color.
The language is standard DX11 HLSL, with the only exception of a #pragma kernel FillWithRed
directive. One compute shader asset file must contain at least one "compute kernel" that can be invoked, and that function is indicated by the #pragma directive. There can be more kernels in the file; just add multiple #pragma kernel
lines.
The #pragma kernel
line can optionally be followed by a number of preprocessor macros to define while compiling that kernel, for example:
#pragma kernel KernelOne SOME_DEFINE DEFINE_WITH_VALUE=1337 #pragma kernel KernelTwo OTHER_DEFINE // ...
In your script, define a variable of ComputeShader
type, assign a reference to the asset, and then you can invoke them with ComputeShader.Dispatch function. See scripting reference of ComputeShader class for more details.
Closely related to compute shaders is a ComputeBuffer class, which defines arbitrary data buffer ("structured buffer" in DX11 lingo). Render Textures can also be written into from compute shaders, if they have "random access" flag set ("unordered access view" in DX11), see RenderTexture.enableRandomWrite.
Textures and samplers aren't separate objects in Unity, so in order to use them in compute shader you have to follow some Unity specific rules:
Texture2D MyTex; SamplerState samplerMyTex
). In this case, sampler will be initialized to that texture's filter/wrap/aniso settings.
"SamplerState MyLinearClampSampler"
- this will have linear filter and clamp wrap mode.
Page last updated: 2012-12-24