android - cómo - porque no se activan los datos moviles en mi samsung
El algoritmo de ruido falla en Samsung Galaxy SIII(GLES) (2)
Estoy luchando para que el próximo 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 completamente en el nuevo teléfono inteligente que utiliza Mali-400 / MP4 de ARM.
¿Alguien puede detectar algo incorrecto con este algoritmo? O tal vez entender por qué podría fallar?
Tu problema probablemente proviene de tomar el sin
de un gran número. El resultado de esto depende de la implementación exacta de sin
, que no está disponible. Obviamente, la función sin
utilizada por el chip Mali tiene resultados más predecibles con números grandes que los demás.
Me parece que deberías usar una función de ruido real , no esta cosa. Al menos tendrá resultados predecibles en todo el hardware.
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 sombreadores de fragmentos en la GPU de Malí. Básicamente, no hay bits fraccionarios dejados por el momento en que se invoca fract
(porque los multiplicadores son tan grandes), por lo que no se devuelve nada de "ruido". Si reduce las constantes, comenzará a recuperar valores que no sean cero, pero no serán ruidosos. (No estoy del todo seguro de cómo se escogieron los valores, y no está claro de dónde vino este algoritmo ).
Técnicamente, este algoritmo de ruido se basa en operaciones de punto flotante de precisión más alta (medio? Alto?), Que son opcionales en los sombreadores de fragmentos. De acuerdo con esta otra publicación , puede verificar la precisión admitida de la plataforma en sombreadores de fragmentos al buscar la extensión "OES_fragment_precision_high" en glGetString(GL_EXTENSIONS)
.
El proyecto de ruido webgl en la respuesta de Nicol no parece ser susceptible a problemas de truncado de punto flotante (parece mantener las cosas en un límite más estricto). Sin embargo, tiene un período de alrededor de 300, y genera más ruido "estructurado" que el ruido "blanco" (o "rosa") que recibe 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.