Принцип я думаю понятен: изображение на пленке таки дискретное и состоит из зерен - я про это рассказывал парой постов выше. Таким образом, если пленка крупнозернистая (по разным причинам) это зерно может быть заметно.
Алгоритм
Тут все еще проще: считаем шум и с коэффициентом добавляем к нашей яркости. Если шум сделать цветным, а не чисто яркостным, то результат будет выглядеть не как пленочное зерно, а как шум на цифровой матрице (но об этом в другой ветке).
float rand(float2 uv){
return fract(sin(dot(uv, float2(12.9898, 78.233))) * 43758.5453);
}
//...
l += 0.1 * rand(In.v_texcoord * (1 + fract(U.time)));
//...
В примере я использую стандартный шейдерный шум от позиции точки, анимирую его по времени, но использую fract, чтобы при больших значениях рандом не стал выглядеть как полосы