init:
Выполняется один раз для пикселя. Здесь задайте начальное значение орбиты и вспомогательные переменные.
Изучите проверенное подмножество FRM FractalPark, поймите, как исходный код превращается в GPU-шейдер, и соберите три рабочие формулы на тех же примерах, что использует редактор.
FRM — это компактный текстовый способ описания итеративного фрактала. Формула задаёт начальное состояние, вычисление, повторяемое для каждой орбиты, и условие, определяющее, продолжается ли итерация.
Формат вырос из экосистемы Fractint, где файлы формул позволяли обмениваться экспериментами без пересборки программы рендеринга. FractalPark переносит эту идею создания формул в браузерный рабочий процесс, документируя собственное проверенное подмножество вместо заявления о полной совместимости.
Об истоках и истории более широкого проекта см. сайт проекта Fractint.
FractalPark токенизирует, разбирает, проверяет и компилирует продуманное подмножество FRM. Таблица разделяет конструкции, которые работают напрямую, конструкции с документированной семантикой FractalPark и конструкции, которые текущий рабочий процесс не может сохранить.
| Уровень | Значение | Проверенный охват |
|---|---|---|
| Поддерживается | Покрыто тестами компилятора и пригодно к использованию без семантических оговорок. |
|
| Адаптировано | Принимается с документированным семантическим отличием или как расширение FractalPark. |
|
| Не поддерживается | Не сохраняется текущим компилятором или файловым рабочим процессом; отклоняется, а не молча переписывается. |
|
Это проверенный базовый уровень совместимости, а не заявление о полной совместимости с Fractint. Когда меняется компилятор, эта матрица и её тесты должны меняться вместе.
Эти показатели возможностей взяты из версионированного манифеста: 588 целевых записей включают 579 прохождений strict-v2 и 9 документированных отступлений; 117 отдельных записей исключены по стабильным причинам.
Параметры: p1, p2, p3, p4, p5 · Слоты функций: fn1, fn2, fn3, fn4
Манифест возможностей v1 · Строгая семантика v2
FRM-формула FractalPark состоит из одного именованного объявления и трёх явных секций. Вместе они определяют переход состояния для каждого пикселя.
Выполняется один раз для пикселя. Здесь задайте начальное значение орбиты и вспомогательные переменные.
Выполняется один раз за итерацию. Обновите z и любое состояние, необходимое следующей итерации.
Возвращает условие продолжения орбиты. Когда оно становится ложным, точка вышла за пределы.
Названия секций структурны, а не являются комментариями: пропуск или опечатка в них приводит к диагностическому сообщению.
Язык намеренно остаётся небольшим: выражения описывают комплексную арифметику, операторы обновляют состояние орбиты, а управляющие конструкции выбирают между обновлениями.
FractalPark не вставляет текст FRM в шейдер. Он прогоняет исходный код через поэтапный компилятор, чтобы синтаксис, смысл, сгенерированный код и диагностика оставались связанными.
Точный текст из редактора, вставки или локального файла является авторитетными входными данными.
Лексер распознаёт имена, числа, операторы, маркеры секций, комментарии и директивы, сохраняя позиции в исходном коде.
Парсер строит структурированное дерево формулы и сообщает о некорректных объявлениях, выражениях и блоках управления.
Валидатор проверяет имена, типы, секции и поддерживаемую семантику перед созданием канонической формулы.
Генерация кода создаёт шейдерные функции и фиксирует сопоставления сгенерированного GLSL с исходным кодом FRM.
Успешная компиляция превращается в тот же контракт плагина формулы, который используют рендерер и система сборки шейдеров.
Общий контракт компилятора держит Обзор, отдельный редактор, сохранённые пользовательские формулы, примеры и тесты на одном пути реализации.
Эти примеры идут от простейшей квадратичной формулы к параметрам и обратной связи с состоянием. Каждый блок исходного кода взят непосредственно из общего реестра примеров и компилируется во время тестов.
Урок 1
Простейшая формула времени убегания — удобна для первого знакомства со структурой init / loop / bailout.
В центре внимания: объявление и структура init / loop / bailout. Меняйте показатель степени или порог убегания только после того, как эта версия скомпилируется.
StarterBrot {
init:
z = 0
loop:
z = z^2 + c
bailout:
|z| < 4
}Урок 2
Демонстрирует слоты параметров p1 / p2 и разницу между cabs и |z|.
В центре внимания: слоты параметров p1 и p2, комплексный литерал и cabs(z) как явная функция величины.
ParameterDrift {
init:
z = 0
loop:
z = z^2 + c + p1 * 0.15 + p2 * (0.05, -0.02)
bailout:
cabs(z) < 8
}Урок 3
Использует zPrev как память обратной связи и хорошо сочетается с раскраской orbitEcho для огибающих орбиты.
В центре внимания: zPrev как предыдущее состояние орбиты. Обратная связь добавляет память без введения второй вручную управляемой переменной состояния.
OrbitEcho {
init:
z = pixel
loop:
z = sqr(z) + zPrev * (0.30, -0.12) + pixel * (0.85, 0.0)
bailout:
|z| < 48
}Редактор FRM открывает эти же примеры, проверенные компиляцией, по стабильному ID. Исходный код формулы остаётся только на текущей вкладке, пока вы не сохраните его в облачной библиотеке формул, и никогда не встраивается в URL.
Компиляция останавливается на самой ранней небезопасной стадии и сообщает сообщения, привязанные к исходному коду. Отклонённая конструкция никогда не переписывается во что-то лишь похожее.
Неожиданные символы и неподдерживаемые идентификаторы сообщаются с указанием строки и столбца.
Некорректные секции, выражения или блоки управления диагностируются до семантической проверки.
Неизвестные переменные, недопустимые присваивания, несоответствие типов и неподдерживаемая семантика не позволяют генерировать код.
Сгенерированный GLSL сохраняет сопоставления, позволяющие связать сбой компиляции шейдера с исходной позицией FRM.
Исправляя ошибку, начните с первого сообщения: более поздняя диагностика может быть следствием того же отсутствующего токена или недопустимого выражения.
Написанная вами формула приватна, пока вы не решите иначе. Есть три способа её распространения — каждый явный, ни один не молчаливый.
Приватно по умолчанию
Формулы хранятся в вашей облачной библиотеке и видны только вам. Сохранённые работы содержат копию исходного кода формулы внутри черновика, поэтому они всегда открываются в том виде, в котором вы их оставили.
Скачайте файл .frm
Ваша формула — это обычный текст. Скачайте её из раздела «Мои формулы» в любое время и храните собственную копию — без запросов на экспорт и ожидания.
Опубликуйте работу, поделитесь исходным кодом
Публикация работы, использующей вашу формулу, делает исходный код формулы общедоступным по лицензии MIT: любой может читать, копировать и развивать его. Страница сообщества показывает имя формулы из её метаданных и предлагает исходный код для скачивания. Для этой публикации действие необратимо.
Полный текст лицензии MIT находится на opensource.org.
Откройте Обзор, чтобы сравнить поведение встроенных формул, раскраску, трансформации, анимацию и элементы управления экспортом, прежде чем писать собственную формулу.
Открыть ОбзорИспользуйте специальный редактор FRM, чтобы компилировать, просматривать, импортировать и скачивать формулы; войдите, чтобы сохранить формулу в облачной библиотеке, прежде чем передать её в Обзор.
Исторический контекст и детали реализации указаны отдельными ссылками, чтобы руководство могло отличать наследие Fractint от текущего контракта компилятора FractalPark.