Algoritmo de ruido falla en Samsung Galaxy SIII (GLES)

Estoy luchando para que el siguiente algoritmo simple funcione en el Samsung Galaxy SIII

float rand(vec2 co)
{
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

....
vec3 color = texture2D(u_texture, v_texcoord);
gl_FragColor.rgb = color + vec3(rand(gl_FragCoord.xy + time / 1000.0));
....

El código genera perfectamente el ruido esperado en Samsung Galaxy S1 y Google Nexus S. Pero falla por completo en el nuevo smartphone que utiliza ARM's Mali-400/MP4.

¿Alguien puede detectar algo malo con este algoritmo? ¿O tal vez entender por qué podría fallar?

preguntado el 02 de julio de 12 a las 13:07

falla como? ¿Está revisando los registros de información en busca de errores/advertencias? -

No hay ningún error, simplemente no muestra ningún píxel de ruido. La imagen general está bien, pero sin ningún ruido. -

Hmm, entonces no estoy seguro. Solo recomendaría quitarlo una capa a la vez hasta que pueda entender por qué. Por ejemplo, ¿funciona fract()? ¿Funciona fract(sin()), ¿funciona fract(sin(punto((()))? etc. -

2 Respuestas

Es probable que su problema provenga de tomar el sin de un numero grande. El resultado de esto depende de la implementación exacta de sin, que no está disponible. Obviamente el sin La función utilizada por el chip Mali tiene resultados más predecibles con números grandes que las demás.

Me parece que deberías usar an real función de ruido, no esta cosa. Al menos tendrá resultados predecibles en todo el hardware.

Respondido 02 Jul 12, 20:07

Probé esta opción porque pensé que sería la mejor, y obtuve resultados muy extraños. Cruce las líneas de sombreado en todas partes en lugar de ruido. He usado el siguiente de la biblioteca: github.com/ashima/webgl-noise/blob/master/src/noise2D.glsl - PerracoLabs

Un poco de discusión sobre este tema en los foros de ARM: http://forums.arm.com/index.php?/topic/16364-random-number-with-mali-400-mp/.

El problema se debe a la precisión del FP16 en los sombreadores de fragmentos en la GPU Mali. Básicamente, no quedan bits fraccionarios en el momento fract se invoca (porque los multiplicadores son muy grandes), por lo que no obtiene ningún "ruido" en absoluto. Si reduce las constantes, comenzará a recuperar valores distintos de cero, pero no serán ruidosos. (No estoy del todo seguro de cómo se eligieron los valores, y su no está claro de dónde vino este algoritmo).

Técnicamente, este algoritmo de ruido se basa en operaciones de coma flotante de precisión más alta (¿media? ¿alta?), que son opcionales en los sombreadores de fragmentos. De acuerdo a esta otra publicación puede comprobar la precisión admitida por la plataforma en los sombreadores de fragmentos comprobando la extensión "OES_fragment_precision_high" en glGetString(GL_EXTENSIONS).

El ruido webgl El proyecto en la respuesta de Nicol no parece tan susceptible a problemas de truncamiento de coma flotante (parece mantener las cosas en un límite más estricto). Sin embargo, tiene un período de alrededor de 300 y genera un ruido más "estructurado" que el ruido "blanco" (o "rosa") que obtiene actualmente. Sin embargo, es una biblioteca excelente, por lo que vale la pena trabajar en su código, incluso si no es un reemplazo directo.

contestado el 23 de mayo de 17 a las 11:05

Terminé usando la biblioteca webgl-noise, aunque todavía estoy tratando de encontrar una alternativa, ya que el algoritmo es demasiado grande y, además, a veces (más de lo que quería) produce ruido que no parece ruido en absoluto, especialmente cuando mezclando con colores oscuros. Así que hasta ahora, además del proyecto webgl-noise, no he encontrado ninguna alternativa. - PerracoLabs

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.