Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
tone robot modeller

Зарегистрирован: 21.09.2007 Сообщения: 513
|
|
Вернуться к началу |
|
 |
Manwe Администратор сайта

Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Чт Дек 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 Сообщения: 1426
|
Добавлено: Пт Дек 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 слов
Делает то же самое. Форт - конечно, мега язык. _________________ Manwe/SandS
www.manwe.ru
Последний раз редактировалось: Manwe (Сб Дек 28, 2013 23:04), всего редактировалось 1 раз |
|
Вернуться к началу |
|
 |
Digimind assembler digger

Зарегистрирован: 22.09.2007 Сообщения: 103
|
Добавлено: Пт Дек 27, 2013 20:54 Заголовок сообщения: |
|
|
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 Сообщения: 1426
|
Добавлено: Сб Дек 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
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
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
15 символов против 28. |
Зачем такое странное сравнение размеров? Звучит как будто циклы в 2 раза хуже. Капец, аж 13 "лишних" символов! Ничего, что они дают гибкость, возможность использовать индекс в вычислениях, дробный индекс, условный break, вложенность и т.д. |
|
Вернуться к началу |
|
 |
Manwe Администратор сайта

Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Сб Дек 28, 2013 15:07 Заголовок сообщения: |
|
|
BiTL писал(а): | А если for(int i = 1; i <= 7000; i++) ? |
7 тысяч циклов на каждый пиксель? Это нереально, видеокарта умрёт - так никто не пишет. И потом ветвления типа IF и циклов, насколько я понимаю, обсчитываются процессором карты по обоим ветвям, что даёт лишнюю нагрузку. Посмотри примеры в ShaderToy - там обычно геометрию не расчитывают в циклах, а тупо задают константами координаты вершин. Хотя, в цикле намного короче. Но для производительности хуже. В конце концов, мы не должны забывать те времена, когда для вывода спрайта 32x32 писали 32 MOVа подряд вместо одного вложенного цикла - кто запамятовал зачем и почему так делали, я не виноват
Digimind писал(а): | В чём собственно челендж?
...радоваться, что для простой формулы "получилось 62 символа"? |
Бывает, что цель - сэкономить размер. Сам же знаешь.
Цитата: | Ничего, что они дают гибкость, возможность использовать индекс в вычислениях, дробный индекс, условный break, вложенность и т.д. |
Можно подумать, что я говорю, будто Forth Haiku мощнее GLSL. Странный ты
Индекс можно и в Forth, первая единичка в моём примере - как раз индекс. Загоняю его в стек и тело цикла его увеличивает. Дробный индекс, естественно, тоже не проблема - главное, чтобы число вызовов было конечно и разумно (а шейдеры этого требуют). Кроме того, в обычном Forth есть циклы, так что нечего тут выискивать зародыши ереси
Просто у 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 Сообщения: 1426
|
Добавлено: Сб Дек 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-гуру!
Вот как это выглядит в действии (оптимизировано до 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 Сообщения: 1426
|
Добавлено: Сб Дек 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 Сообщения: 1426
|
Добавлено: Вс Дек 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 |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|