gshader

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):

Mandelbrot set

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")
,