www.demoscene.ruenglish version
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация   ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Forth Haiku
На страницу 1, 2, 3 ... 19, 20, 21  След.
 
Начать новую тему   Ответить на тему    Список форумов DemoScene.Ru -> Демо
Предыдущая тема :: Следующая тема  
Автор Сообщение
tone
robot modeller


Зарегистрирован: 21.09.2007
Сообщения: 513


СообщениеДобавлено: Чт Дек 26, 2013 19:40    Заголовок сообщения: Ответить с цитатой

Саша! Вот идеальный шайдортой для тебя
http://forthsalon.appspot.com/haiku-view/ahBzfmZvcnRoc2Fsb24taHJkcg0LEgVIYWlrdRiNpAEM

ты вроде фанат правильного языка
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Чт Дек 26, 2013 22:53    Заголовок сообщения: Ответить с цитатой

tone писал(а):
Саша! Вот идеальный шайдортой для тебя
ты вроде фанат правильного языка

Офигительно. Forth - язык программирования следующей цивилизации!
Но сайт сделан странно. Пока я докопался до документации, 5 минут прошло. А пока понял, что цвет задаётся тремя вещественными числами в вершине стека - ещё столько же.
А вообще, было бы круто хардварный Forth-процессор на видеокарту.
Что может быть изящней такой программы?
Код:
x y + 1.23 +
x * y * y sin 2dup
* over < x -



Я тут же изменил один из примеров, добавив к нему анимацию, получилось 62 символа
Код:
: a x y z* sin ;
x 3 *
x t sin +
y t cos 2 * +
- a exp y a

Можно проводить конкурс 128-байтных программок на Forth.
_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Пт Дек 27, 2013 13:42    Заголовок сообщения: Forth Haiku Ответить с цитатой

Не, правда очень круто.
Вот дефолтный шейдер из ShaderToy, 105 символов
Код:
void main(void)
{
   vec2 uv = gl_FragCoord.xy / iResolution.xy;
   gl_FragColor = vec4(uv,0.5+0.5*sin(iGlobalTime),1.0);
}

А вот я переписал его в Forth Haiku, 19 байт, 8 слов
Код:
x y t sin 2 / 0.5 +

Делает то же самое. Форт - конечно, мега язык.
_________________
Manwe/SandS
www.manwe.ru


Последний раз редактировалось: Manwe (Сб Дек 28, 2013 23:04), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Digimind
assembler digger


Зарегистрирован: 22.09.2007
Сообщения: 103


СообщениеДобавлено: Пт Дек 27, 2013 20:54    Заголовок сообщения: Ответить с цитатой

tone писал(а):
Саша! Вот идеальный шайдортой для тебя
http://forthsalon.appspot.com/haiku-view/ahBzfmZvcnRoc2Fsb24taHJkcg0LEgVIYWlrdRiNpAEM

ты вроде фанат правильного языка

Manwe писал(а):
Офигительно. Forth - язык программирования следующей цивилизации! ... Что может быть изящней


Столько прям эпитетов: идеальный, правильный, офигительный, следующая цивилизация, изящный.
С такими примитивнейшими эффектами сравнение с шейдертой как минимум некорректно в плане возможностей.
Да и в плане изящности тоже - эквивалент вышеприведенной ссылки на GLSL занимает в 3 раза меньше места:
Код:

float r=x*x+y*y,c=r>.83&&r<.85;
if(r<.77)
{
if(y<0)y=-y,x=-x,c=1;
y-=.45;r=x*x+y*y;
if(r>.02&&(x>0&&r<.2||x<0))c=1-c;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
tone
robot modeller


Зарегистрирован: 21.09.2007
Сообщения: 513


СообщениеДобавлено: Сб Дек 28, 2013 01:57    Заголовок сообщения: Ответить с цитатой

стека контекстом с нету глсле в зато
скучный поэтому он
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Сб Дек 28, 2013 11:43    Заголовок сообщения: Ответить с цитатой

Это же Форт-хайку, а не стандартный Форт - из него даже выкинули IF и FOR. Минимализм.
И, конечно, нет многих функций GLSL - мне пришлось вручную писать даже fract, не говоря уже о dot, mix, clamp и smoothstep. Понятно, что это JavaScript-игрушка, а не инструмент для полного контроля над железом видеокарты. Сравнивать нет смысла. Здесь интересен хайку-челендж сам по себе.
Но вот чего я не могу понять и простить - это отсутствие 2SWAP. Нет никакой логики в отсутствии этого важнейшего (для графики) оператора. И, главное, на сайте нет никаких контактов - кому написать, чтобы добавили.

P.S. на самом деле, даже отсутствие FOR не так пугает. Вот, например, часть кода GLSL
Код:
for(int i = 1; i <= 7; i++)

А вот то же самое на Forth
Код:
1 L L L L L L L

15 символов против 28. Тело цикла заношу в словарь (описание - аналог фигурных скобок в Си) под именем "L" (от слова "Loop") и вызываю 7 раз. Никаких ветвлений (что, кстати, для шейдеров было бы полезно).
_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
BiTL
DOS lover


Зарегистрирован: 22.09.2007
Сообщения: 2950


СообщениеДобавлено: Сб Дек 28, 2013 13:55    Заголовок сообщения: Ответить с цитатой

Manwe писал(а):

P.S. на самом деле, даже отсутствие FOR не так пугает. Вот, например, часть кода GLSL
Код:
for(int i = 1; i <= 7; i++)

А вот то же самое на Forth
Код:
1 L L L L L L L

15 символов против 28. Тело цикла заношу в словарь (описание - аналог фигурных скобок в Си) под именем "L" (от слова "Loop") и вызываю 7 раз. Никаких ветвлений (что, кстати, для шейдеров было бы полезно).


А если
Код:
for(int i = 1; i <= 7000; i++)
?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mikle



Зарегистрирован: 02.12.2008
Сообщения: 432
Откуда: Туапсе

СообщениеДобавлено: Сб Дек 28, 2013 14:07    Заголовок сообщения: Ответить с цитатой

BiTL писал(а):
А если
Код:
for(int i = 1; i <= 7000; i++)
?

Это ещё ладно, можно использовать LL (10 вызовов L), LLL(100 вызовов) и так далее. А вот если:
Код:
for(int i = 1; i <= iMax; i++)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Digimind
assembler digger


Зарегистрирован: 22.09.2007
Сообщения: 103


СообщениеДобавлено: Сб Дек 28, 2013 14:09    Заголовок сообщения: Ответить с цитатой

Manwe писал(а):
Здесь интересен хайку-челендж сам по себе.


В чём собственно челендж? "Лохматить бабушку" с очередной разновидностью эффекта плазмы, который старше тебя? И радоваться, что для простой формулы "получилось 62 символа"?

Manwe писал(а):
Вот, например, часть кода GLSL
Код:
for(int i = 1; i <= 7; i++)

А вот то же самое на Forth
Код:
1 L L L L L L L

15 символов против 28.


Зачем такое странное сравнение размеров? Звучит как будто циклы в 2 раза хуже. Капец, аж 13 "лишних" символов! Ничего, что они дают гибкость, возможность использовать индекс в вычислениях, дробный индекс, условный break, вложенность и т.д.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Сб Дек 28, 2013 15:07    Заголовок сообщения: Ответить с цитатой

BiTL писал(а):
А если for(int i = 1; i <= 7000; i++) ?

7 тысяч циклов на каждый пиксель? Это нереально, видеокарта умрёт - так никто не пишет. И потом ветвления типа IF и циклов, насколько я понимаю, обсчитываются процессором карты по обоим ветвям, что даёт лишнюю нагрузку. Посмотри примеры в ShaderToy - там обычно геометрию не расчитывают в циклах, а тупо задают константами координаты вершин. Хотя, в цикле намного короче. Но для производительности хуже. В конце концов, мы не должны забывать те времена, когда для вывода спрайта 32x32 писали 32 MOVа подряд вместо одного вложенного цикла - кто запамятовал зачем и почему так делали, я не виноват Smile

Digimind писал(а):
В чём собственно челендж?
...радоваться, что для простой формулы "получилось 62 символа"?

Бывает, что цель - сэкономить размер. Сам же знаешь.

Цитата:
Ничего, что они дают гибкость, возможность использовать индекс в вычислениях, дробный индекс, условный break, вложенность и т.д.

Можно подумать, что я говорю, будто Forth Haiku мощнее GLSL. Странный ты Smile
Индекс можно и в Forth, первая единичка в моём примере - как раз индекс. Загоняю его в стек и тело цикла его увеличивает. Дробный индекс, естественно, тоже не проблема - главное, чтобы число вызовов было конечно и разумно (а шейдеры этого требуют). Кроме того, в обычном Forth есть циклы, так что нечего тут выискивать зародыши ереси Smile
Просто у Forth другая логика программирования, и тупо переносить алгоритмы с GLSL - не совсем правильно. Я уж не говорю о том, что GLSL работает с многомерными векторами, а Forth - только с одномерными. Но даже при тупом переносе многие программы получается короче - чисто в силу синтаксиса. Не нравится синтаксис - никто ж не заставляет писать на этом языке.

tone писал(а):
стека контекстом с нету глсле в зато
скучный поэтому он

Юмор они понимать нет
_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
BiTL
DOS lover


Зарегистрирован: 22.09.2007
Сообщения: 2950


СообщениеДобавлено: Сб Дек 28, 2013 19:20    Заголовок сообщения: Ответить с цитатой

Manwe писал(а):

tone писал(а):
стека контекстом с нету глсле в зато
скучный поэтому он

Юмор они понимать нет


Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Сб Дек 28, 2013 20:03    Заголовок сообщения: Ответить с цитатой

Оригинал с ShaderToy (381 символ)
Код:
float textureRND2D(vec2 uv)
{
   vec2 f = fract(uv);
   f = f*f*(3.0-2.0*f);
   uv = floor(uv);
   float v = uv.x+uv.y*1e3;
   vec4 r = vec4(v, v+1., v+1e3, v+1e3+1.);
   r = fract(1e5*sin(r*1e-3));
   return mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);   
}

void main( void )
{
   vec2 p = gl_FragCoord.xy/iResolution.xy;
   float c = step(textureRND2D(p*5.+vec2(0.,-iGlobalTime)),p.y*.7+.1);
   gl_FragColor = vec4(mix(vec3(1.2,.5,0.2)*p.y, vec3(p.y), c),1.0);
}

Грубый порт на Forth Haiku (в точности 381 символ)
Код:
: px x 5 * ;
: py y 5 * t - ;
: fract dup floor - ;
: mix dup push * swap 1 pop - *  + ;
: f fract dup dup 2 * 3 swap - * * ;
: r -3 exp * sin 5 exp * fract ;
: v px floor py floor 3 exp * + ;
: texture
v r v 1 + r px f mix
v 3 exp + dup push r pop 1 + r px f mix
py f
mix ;

texture y 0.7 * 0.1 + > dup dup push push push
1.2 y * y pop mix
0.5 y * y pop mix
0.2 y * y pop mix

Конечно, есть куда оптимизировать. Чем и займусь.
Там, правда, косяк ещё такой: во время отрисовки кадра при каждом обращении к таймеру выдаётся новое значение (чуть убегает вперёд). Поэтому вся картинка медленно ползёт вверх, как будто у телевизора частота строк не подстроена. А в GLSL, похоже, переменная времени обновляется только один раз в кадр (то есть все точки кадра отрисовываются с одинаковыми параметрами времени).
Либо я ошибся в коде. Кто найдёт ошибку - тому звание Forth-гуру! Smile
Вот как это выглядит в действии (оптимизировано до 340 символов, из них 58 ушло на определение GLSL-функций, которых нет в Forth).

Код:
: px x 5 * ;
: py y 5 * t - ;
: fract dup floor - ;
: mix dup push * swap 1 pop - * + ;
: f fract dup dup 2 * 3 swap - * * ;
: r -3 exp * sin 5 exp * fract ;
: v px floor py floor 3 exp * + ;
: c y * y pop mix ;
v r v 1 + r px f mix
v 3 exp + dup push r pop 1 + r px f mix
py f mix
y 0.7 * 0.1 + > dup dup push push push
1.2 c 0.5 c 0.2 c

_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Сб Дек 28, 2013 20:05    Заголовок сообщения: Ответить с цитатой

Как бы вот.

Digimind писал(а):
Да и в плане изящности тоже - эквивалент вышеприведенной ссылки на GLSL занимает в 3 раза меньше места:
Код:

float r=x*x+y*y,c=r>.83&&r<.85;
if(r<.77)
{
if(y<0)y=-y,x=-x,c=1;
y-=.45;r=x*x+y*y;
if(r>.02&&(x>0&&r<.2||x<0))c=1-c;
}

iq/RGBa потратил на это гораздо больше - 306 символов
Код:
void main(void)
{
    vec2 p = 1.1*(2.0*gl_FragCoord.xy-iResolution.xy)/min(iResolution.x,iResolution.y);

    float h = dot(p,p);
    float d = abs(p.y)-h;
    float a = d-0.23;
    float b = h-1.00;
    float c = sign(a*b*(p.y+p.x + (p.y-p.x)*sign(d)));
      
    c = mix( c, 0.0, smoothstep(0.98,1.00,h) );
    c = mix( c, 0.6, smoothstep(1.00,1.02,h) );
   
   gl_FragColor = vec4( c,c,c, 1.0 );
}

Уверен, ты и программу на Forth сможешь оптимизировать, если захочешь.
_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
tone
robot modeller


Зарегистрирован: 21.09.2007
Сообщения: 513


СообщениеДобавлено: Вс Дек 29, 2013 00:31    Заголовок сообщения: Ответить с цитатой

подумалось, что этому треду все еще бесконечно далеко по количеству оффтопика до легендарного "отстойная демка".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Вс Дек 29, 2013 00:41    Заголовок сообщения: Ответить с цитатой

Попробовал сделать рейтрейсинг - в самом простом случае (шар в воздухе) 14 шагов ещё получается, на 15-ом отрубается. Очевидно, компиляция в GLSL не предусматривает кучу вызовов одинаковой функции (а в режиме JavaScript вообще не работает). Тут бы, конечно, оператор FOR помог, но его убрали, злыдни. Нечего, мол, тут вам рейтрейсингом баловаться.
Код:
: x0 x 2 * 1 - ;
: y0 y 2 * 1 - ;
: n x0 dup * y0 dup * + 4 + sqrt ;
: len3 dup * swap dup * + swap dup * + sqrt ;
: world dup dup push push x0 n / * pop y0 n / * pop -2 n / * 3 + len3 1 - ;
: l dup world + ;
0
l l l l l l l l l l
5 /
dup dup

244 символа, пока не оптимизировано.
Ссылка

_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов DemoScene.Ru -> Демо Часовой пояс: GMT + 3
На страницу 1, 2, 3 ... 19, 20, 21  След.
Страница 1 из 21

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах