Můj program v Golangu pro generování obrázků do PNG souboru. Tady jsem si vytvořil něco jako ShaderToy, který běžně běží na GPU, napsal jsem si takovou hračku počítanou na CPU s masivním multithreadingem (každý řádek je počítán samostatném threadu).
Ke stažení na mém GitHubu.
Lze generovat libovolné obrázky, nejjednodušší na ukázku a výpočet je Mandelbrotova množina (fraktál):

Výpočetní jádro je v souboru compute.go, kde se počítá ve více threadech po řádcích. Můžete si to změnit a měřit tak výkon na pixel / řádek / sloupec – toto je dobré cvičení pro pochopení tak zvané memory locality a počítání cache line miss.
Jednotlivé shadery jsou umístěny ve složce shader, zde je výpočet známé Mandelbrotovy množiny:
func Mandelbrot(x int, y int, width int, height int) color.Color {
c := complex(normalize(x, width, -2, 2), normalize(y, height, -2, 2))
const INTER = 1024
z := 0 + 0i
iter := 0
for ; (cmplx.Abs(z) <= 2) && (iter < INTER); iter++ {
z = z*z + c
}
return color.Gray{uint8((255 * iter) / INTER)}
}
Výhodou je, že Golang má nativní datový typ Complex pro komplexní čísla. Shader tak lze psát stejně jako v matematice.
Složka colormap potom obsahuje mapování barev na data ze shaderu. Zde si můžete vytvořit různé barevné duhy apod.
Shadery a mapování barev se registruje přímo v main.go:
registerShader(shader.Mandelbrot, "mandel")
registerShader(shader.Gradient, "gradient")
registerShader(shader.Julia1, "julia1")
registerShader(shader.Julia2, "julia2")
registerShader(shader.RandomNoise, "randomnoise")
registerColormap(colormap.Red, "red")
registerColormap(colormap.Rainbow, "rainbow")