Shader Learn

00 Prólogo: cómo pinta una GPU

Dos bucles anidados en C, una pasada en la GPU

La misma función shade(): la CPU calcula una celda cada vez; la GPU la llama para todas a la vez.

UV0.50, 0.50
424
4120
Explicación

Arrastra los números subrayados a izquierda y derecha

for (int y = 0; y < ; y++)  for (int x = 0; x < ; x++)    image[y][x] = shade(x, y);// la llamada i-ésima
i =0/ 144

void main() {  // aquí no hay bucle:  // main se ejecuta una vez por píxel  gl_FragColor = shade(vUv);}
Se llama144veces a la vez
Esta celda(6, 6) → RGB (0.54, 0.54, 0.25)
Diferencia clavemain solo conoce su propia posición; no puede ver lo que calcularon sus vecinos

Un lienzo real tiene de cientos de miles a millones de píxeles; una GPU tiene miles de núcleos pequeños trabajando a la vez.

Lado JSgl.uniform1f(uTime, 0.00)

En C escribes dos bucles for anidados; en la GPU solo escribes el cuerpo del bucle, y la GPU lo llama para todos los píxeles a la vez.

Pruébalo

  • Elige «CPU · una a una» y observa cómo se rellenan las celdas
  • Elige «GPU · todas a la vez»: todas las celdas aparecen juntas
  • Mueve el puntero y lee la entrada y salida de una celda