Búsqueda de sitios web

typescript - ¿Cómo usar un número aleatorio dentro de WGSL?


Estoy intentando crear un shader de fragmentos en una aplicación WebGPU para renderizar una imagen en blanco y negro con ruido.

Ruido_blanco (wikipedia)

Para esto solo quiero que cada píxel tenga un valor de color aleatorio como este:

[[stage(fragment)]]
fn main() -> [[location(0)]] vec4<f32> {
  let color: f32 = random();
  return vec4<f32>(color, color, color, 1.0);
}

Pero WGSL no parece proporcionar una función que devuelva números aleatorios. Al menos no pude encontrar nada en las especificaciones.

¿Hay alguna manera de obtener números aleatorios en el shader de fragmentos para cada fragmento?

Respuesta #1

No hay funcionalidad de aleatoriedad en WGSL o GLSL, por lo que tienes que implementar tu propio generador de números aleatorios. Hay diferentes enfoques para implementarlo, ya sea mediante números generados por la CPU y pasados al shader a través de un uniforme o mediante un algoritmo dentro del shader, como ha descrito @skmr.

Un posible algoritmo podría ser: https://indico.cern.ch/event/93877/contributions/2118070/attachments/1104200/1575343/acat3_revised_final.pdf

Respuesta #2

Me encontré con el mismo problema al portar algo de código paralelo de CUDA (que proporciona cuRand) a OpenCL hace algunos años. Encontré una solución muy buena en la biblioteca random123: https://github.com/DEShawResearch/random123. Esta biblioteca ofrece una serie de "generadores de números aleatorios basados en contador", que son funciones que proporcionan el N-ésimo número pseudoaleatorio en una secuencia al pasarles el índice N (a diferencia de los RNG tradicionales que calculan el siguiente valor a partir del valor anterior, y por lo tanto no son paralelizables).

Actualización: He portado el generador de números aleatorios "threefry2x32" (de la biblioteca random123) de C a javascript/WGSL y funciona muy bien. Planeo ponerme en contacto con el autor/mantenedor de random123 para ver si les gustaría integrar esto en su repositorio. Quiero asegurarme de no infringir su copyright.

Artículos relacionados