Во время изучения шейдинга я часто встречал примеры максимально компактного кода, в котором на первом месте стояла краткость написания, а не удобство чтения. Следуя этой традиции я тоже старался:
1. Экономить символы и пробелы.
2. Давать переменным однобуквенные имена.
3. Записывать формулы целиком в длинные строки.
Выглядело это примерно так:
float a = clamp(fg2circ(uv,vec2(0.5)+m,1.2+distance(vec2(0.5),vec2(MX,MY)),k*A),0.0,1.0);
Многие программисты также экономили нули, записывая «1.» вместо «1.0» и «.5» вместо «0.5», но приучить себя к этому мне не удалось.
В фильтрах для lowercase я решил уйти от подобного сжатия в сторону того, что мне тогда казалось более прозрачным или даже «поэтичным» форматированием кода. Для этого я начал придерживаться таких правил:
1. Давать переменным короткие, но понятные имена.
2. Чаще создавать и именовать новые переменные.
3. Использовать минимум математических операций на строку.
4. Выстраивать код скорее вертикально, чем горизонтально.
5. Группировать строки как по смыслу, так и по визуальному сходству.
Мне хотелось, чтобы внешне код фильтра напоминал что-то вроде стихотворения:
vec3 blur = texture(texBlurry, vUv).rgb;
vec3 main = texture(texCamera, vUv).rgb;
vec3 tear = mixDifference(main, blur, 1.0);
vec2 down = vUv + vec2(0.0, 0.01*(blur.g-0.5));
vec3 feed = texture(texOutput, down).rgb;
vec3 ctrl = tear * (1.0-uMouse.x);
tear = mixDifference(tear, feed, 1.5);
float drop = rgbAvg(tear-ctrl);
drop *= step(drop, 1.0+blur.g);
fragColor = vec4(vec3(drop), 1.0);
Подобный код казался мне красивее и понятнее того, что было раньше и я стал получать больше удовольствия от самого процесса написания и форматирования шейдеров, что пригодилось мне для дальнейшей работы.
Изображения сняты через фильтр:
▹ lowercase / cloudless sky




