Compute Shaders son unos programas que corren en la tarjeta gráfica, a fuera del pipeline normal de rendering. Estos se pueden utilizar para algoritmos GPGPU masivamente paralelos, o para acelerar partes del rendering del juego. Con el fin de utilizarlos eficientemente, a veces se necesita un profundo conocimiento de arquitecturas GPU y algoritmos; al igual que conocimiento de DirectCompute, OpenCL o CUDA.
Los Compute Shaders en Unity coinciden cerca con la tecnología DirectX 11 DirectCompute. Plataformas dónde los compute shaders funcionan:
Similar a los shaders regulares, los Computer Shaders son archivos asset en su proyecto, con una extensión de archivo *.compute
. Están escritos en un estilo de lenguaje DirectX 11 HLSL, con una cantidad minima de directivas de compilación #pragma
para indicar qué funciones se compilan como compute shader kernels.
He aquí un ejemplo mínimo de un archivo compute shader:
// 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);
}
Tenga en cuenta que el ejemplo de arriba no hace nada remotamente interesante, simplemente llena la textura output con rojo.
El lenguaje es DX11, HLSL, estándar con la única excepción de una directiva #pragma kernel FillWithRed
.Un archivo compute shader asset debe tener al menos un “compute kernel” que se pueda invocar, y esa función es indicada por la directiva #pragma. Puede haber más kernels en el archivo; simplemente agregue múltiples lineas #pragma kernel
.
Por favor tenga en cuenta que cuando utilice varias lineas #pragma kernel
que comentan el estilo // text
no se permiten en la misma linea que las directivas #pragma kernel
y causará errores de compilación.
La linea #pragma kernel
puede opcionalmente ser seguida por un número de macros de pre-procesador para definir mientras se compila ese kernel, por ejemplo:
#pragma kernel KernelOne SOME_DEFINE DEFINE_WITH_VALUE=1337
#pragma kernel KernelTwo OTHER_DEFINE
// ...
En su script, defina una variable de tipo ComputeShader
, asigne una referencia al asset, y luego usted puede invocarlas con la función ComputeShader.Dispatch. Vea la referencia scripting de ComputeShader class para más detalles.
Cercanamente relacionado a compute shaders está la clase ComputeBuffer, que define información búfer arbitraria (“structured buffer” en DX11 lingo). Render Textures también puede ser escrita en desde compute shaders, si tienen una bandera “random access” establecida (“unordered access view” en DX11), vea RenderTexture.enableRandomWrite.
Las Texturas y los muestradores no son objetos separados en Unity, entonces con el fin de utilizarlos en compute shader usted debe seguir las siguientes reglas especificas de Unity:
Texture2D MyTex; SamplerState samplerMyTex
). En este caso, sampler será inicializado a los ajustes de filter/wrap/aniso de esa textura."SamplerState MyLinearClampSampler"
- este va a tener un filtro lineal y modo clamp de envoltura.Al igual que con los shaders regulares, Unity es capaz de traducir los compute shaders de HLSL a GLSL. Por lo tanto para las construcciones multiplataforma sencillas se recomienda escribir compute shaders en HLSL.
Con el fin de lograr unos shaders que funcionen en varias plataformas, uno debe considerar estas limitaciones:
Típicamente los archivos compute shader están escritos en HLSL, y compilados o traducidos en todas las plataformas necesitadas automáticamente. Sin embargo, es posible prevenir la traducción a GLSL (i.e. solo mantiene plataformas HLSL), o para escribir código de calculo GLSL manualmente.
*Las fuentes compute shader en vueltas por las palabras clave CGPROGRAMy
ENDCGno serán procesadas para las plataformas OpenGL/GLSL.
* Las fuentes compute shader envueltas por las palabras clave
GLSLPROGRAMy
ENDGLSL` serán tratadas como fuentes GLSL, y emitidas verbatim. Esto solamente funciona cuando se apunte a plataformas OpenGL/GLSL.
Tenga en cuenta que para las construcciones multi-plataforma ninguna de las dos se recomienda, ya que significa que las fuentes compute shader serán excluidas para algunas plataformas.