ShaderforthЦитата:
Shaderforth — это язык шейдеров, вдохновленный Forth и APL, который компилируется в GLSL. Он также содержит интерактивную среду разработки, поддерживающую несколько проходов, а также элементы пользовательского интерфейса.
Цитата:
Вы можете скомпилировать шейдеры, запустив: python compile.py [имя файла.srf] > output.glsl.
Чтобы запустить среду разработки, просто запустите: python live/serve.py [имя файла.srf], а затем перейдите по адресу
http://localhost:5000/.
P.S. Не все примеры у меня собираются и для того, чтобы проверить результат в
https://www.shadertoy.com файлы требуют небольшой правки, а именно:
Цитата:
gl_FragColor заменить на fragColor
void main() заменить на void mainImage( out vec4 fragColor, in vec2 fragCoord )
убрать переопределяемые переменные вначале файла
заменить переменную iGobalTime на iTime
оператор ? записать как ?:
и не копировать какой то мусорный код в начале шейдерного файла тоже.

Пример: Мандельброт
Цитата:
import[ noise ]
:globals
@vec3 uniform =iResolution
@float uniform =iGlobalTime
;
:m time iGlobalTime 4 / ;
iResolution frag->position =p
:m c* ( $a $b ) [ a .x b .x * a .y b .y * - a .y b .x * a .x b .y * + ] ;
:m csq dup c* ;
:m c** ( x n ) [ n x .y.x atan2 * dup cos swap sin ] x length n ** * ;
:m cmag length ;
6 =>maxplunge
[
0 [ -.746 .09997 ]
1 [ .275 .0077 ]
2 [ -.101 .837 ]
[ -.088 .6555 ]
] !size 1 + =>count time maxplunge count * mod maxplunge 2 * / floor choose =point
maxplunge time maxplunge 2 * mod maxplunge swap - abs - =mtime
[ 0 0 ] =z
p mtime mtime 1 + ** / point + =c
200 =>numiters
{
float numiters 1 - / =depth
z csq c + =z
&break z cmag 2 > when
} numiters times
[ depth 1 1 ] hsv1->rgb
[ 0 0 0 ]
z cmag 2 >= select ->fragcolor
Выхрдной файл на языке GLSL
Код:
vec3 hsv1_0_1rgb(vec3 hsv) {
return mix(vec3(1.), clamp(abs(mod(hsv.x * 6. + vec3(0., 4., 2.), 6.) - 3.) - 1., 0., 1.), hsv.y) * hsv.z;
}
void mainImage( out vec4 fragColor, in vec2 fragCoord ){
float depth;
vec2 p = (gl_FragCoord.xy / iResolution.xy * 2. - 1.) * vec2(iResolution.x / iResolution.y, 1.);
vec2 point = (floor(mod(iTime / 4., 48.) / 12.) == 0. ? vec2(-.746, .09997) : (floor(mod(iTime / 4., 48.) / 12.) == 1. ? vec2(.275, .0077) : (floor(mod(iTime / 4., 48.) / 12.) == 2. ? vec2(-.101, .837) : vec2(-.088, .6555))));
float mtime = 6. - abs(6. - mod(iTime / 4., 12.));
vec2 z = vec2(0.);
vec2 c = p / pow(mtime, mtime + 1.) + point;
for(int temp_6 = 0; temp_6 < 200; ++temp_6) {
depth = float(temp_6) / 199.;
z = vec2(z.x * z.x - z.y * z.y, z.y * z.x + z.x * z.y) + c;
if(length(z) > 2.) {
break;
}
}
fragColor = vec4((length(z) >= 2. ? hsv1_0_1rgb(vec3(depth, 1., 1.)) : vec3(0.)), 1.);
}
https://www.shadertoy.com/view/Mtf3RMP.S.
Другие демки на shadertoy.com с тегом ShaderForthВ целом, можно результаты работы проверять и локально, к примеру, в
GIPSЦитата:
GIPS: The GLSL Image Processing System