Алгоритм шума в Samsung Galaxy SIII (GLES)

Я изо всех сил пытаюсь получить следующий простой алгоритм, работающий в 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)); .... 

Код генерирует совершенно ожидаемый шум в Samsung Galaxy S1 и Google Nexus S. Но он полностью не работает в новом смартфоне, который использует ARM Mali-400 / MP4.

Кто-нибудь может обнаружить что-то не так с этим алгоритмом? Или, может быть, понять, почему это может потерпеть неудачу?

Ваша проблема, вероятно, исходит от принятия sin большого числа. Результат этого зависит от точной реализации sin , которая недоступна. Очевидно, что функция sin используемая чипом Mali, имеет более предсказуемые результаты с большими числами, чем другие.

Мне кажется, что вы должны использовать фактическую функцию шума , а не эту вещь. По крайней мере, он будет иметь предсказуемые результаты по всему аппарату.

Немного обсуждается эта проблема на форумах ARM: http://forums.arm.com/index.php?/topic/16364-random-number-with-mali-400-mp/ .

Проблема заключается в точности точности FP16 в флеш-шейдерах на Мали-графическом процессоре. В принципе, не существует дробных битов, оставшихся от момента времени, fract (потому что множители настолько велики), поэтому вы вообще не получаете никакого «шума». Если вы уменьшите константы, вы снова начнете получать ненулевые значения, но они не будут шумными. (Я не совсем уверен, как были выбраны значения, и неясно, откуда взялся этот алгоритм ).

Технически этот алгоритм шума опирается на операции с плавающей запятой с высокой (средней? Высокой?) Точностью, которые являются необязательными в шейдерах фрагментов. В соответствии с этим другим сообщением вы можете проверить поддерживаемую платформой точность в фрагментарных шейдерах, проверив расширение «OES_fragment_precision_high» в glGetString(GL_EXTENSIONS) .

Проект webgl-noise в ответе Николо не кажется восприимчивым к вопросам усечения с плавающей запятой (похоже, он держит вещи в более жесткой связи). Тем не менее, он имеет период около 300, и он генерирует более «структурированный» шум, чем «белый» (или «розовый») шум, который вы в настоящее время получаете. Его отличная библиотека, тем не менее, поэтому стоит работать в вашем коде, даже если это не замена.