Пару лет назад я наткнулся на одну картинку с простой геометрией:

Её легко получилось нарисовать в ascii-арт, а теперь я запрограммировал видеокарту для того чтобы получить сотни таких же картинок на матрице, плавно перетекающих друг в друга. Что касается геометрии, то тут вроде вопросов нет, а вот солнечный узор и текст получилось сделать не сразу.Что-то напоминающее оригинальную текстуру узора у меня получилось с помощью такой операции:

c=(vec4(ceil(sin(r))+mod(y,2.0))+vec4(ceil(cos(r))+mod(x,2.0)))*(vec4(ceil(sin(r2))+mod(y,2.0))+vec4(ceil(cos(r2))+mod(x,2.0)));

где r и r2 это квадрат радиуса и радиус. Но с текстом наверное поинтереснее: абстрактный текст я научился получать таким обраом https://www.shadertoy.com/view/sdKXW1 а вот еще пример https://www.shadertoy.com/view/fdySWD теперь осталось только натянуть текст на геометрию. Для этого надо подобрать перпендикулы. Для диагонали вместо х и у используем их сумму и разность в операции деления по модулю. А для того чтобы натянуть абстрактный текст на круг нам придется заменить эти переменные на радиус и градусы. Если вы хотите пустить текст по заданной кривой, например, y=sin(x/32.0)*8.0 подойдет этот код:

void mainImage(out vec4 c,in vec2 o){
    float y=floor(o.y/2.0)-iResolution.y/4.0;
    float x=floor(o.x/2.0); float r=floor(pow(x,2.0)+pow(y,2.));
    c=vec4(ceil(ceil(sin(r)*4.0)+ceil(abs(y+(sin(x/32.0))*8.0))));
    if(cos(x)>0.0)c=vec4(1);
}

Перпендикуляром в данном случае будет косинус.

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

Если интересно посмотреть как текст оживает или посмотреть на весь код целиком: то вот ссылка на шейдертой.

Комментарии (4)


  1. andy128k
    12.12.2021 15:29
    +2

    Вот она какая, прикладная каббала! Интересно было бы разобраться в коде.


    1. 4eckme Автор
      12.12.2021 15:58

      Самое интересное это то что мы генерируем бесконечную матрицу с текстом. Особенно хорошо это видно по второй ссылке: если не ошибаюсь, каждый иероглиф получился по 2 байта, как в юникоде. Так что теоретически это можно воспринимать как бесконечный зашифрованный юникод-текст. Удивительно что ограниченный набор исходного когда (символов) генерирует бесконечное количество информации.

      Код у меня не очень удобно читать, слишком много логических условий для воспроизведения геометрии картинки, но основные моменты я выделил.


  1. PereslavlFoto
    13.12.2021 04:05
    +1

    Боюсь, это не «картинка с простой геометрией», а картинка с простой гематрией.


  1. 4eckme Автор
    13.12.2021 19:50

    Я тут еще добавил пару шейдеров для абстрактного текста, на этот раз на основе радиальных форм, смотрится очень даже неплохо, код простой: https://www.shadertoy.com/view/fltSRj