Добро пожаловать в Open Shading Language!
Open Shading Language (OSL) — небольшой, но богатый язык для программируемого затенения в продвинутых средствах визуализации и других приложениях, идеально подходящий для описания материалов, источников света, смещения и создания узоров.
OSL был первоначально разработан Sony Pictures Imageworks для использования в ее собственном средстве рендеринга, используемом для анимации художественных фильмов и визуальных эффектов, выпущен с открытым исходным кодом, чтобы его могли использовать другие студии визуальных эффектов и анимации, а также поставщики программного обеспечения для рендеринга. Теперь это де-факто стандартный язык шейдеров для визуальных эффектов и анимационных функций, используемый в отрасли во многих коммерческих и собственных средствах визуализации. Благодаря этому работа над OSL получила премию Американской киноакадемии за технические достижения в 2017 году.
OSL надежен и проверен на практике и использовался в таких разнообразных фильмах, как «Новый Человек-паук», «Отель Трансильвания», «Грань завтрашнего дня», «Человек-муравей», «В поисках Дори» и многих других. Поддержка OSL имеется в большинстве ведущих средств визуализации, используемых для высококачественных визуальных эффектов и анимации. Полный список фильмов и произведений смотрите в фильмографии.
Код OSL распространяется по лицензии «Новая/3 пункта BSD», а документация — по международной лицензии Creative Commons Attribution 4.0. Короче говоря, вы можете свободно использовать OSL в своих приложениях, независимо от того, являются ли они бесплатными или коммерческими, открытыми или проприетарными, а также изменять код и документацию OSL по вашему желанию при условии, что вы сохраните оригинальные уведомления об авторских правах, как описано в разделе лицензия.
OSL имеет синтаксис, аналогичный C, а также другим языкам шейдеров. Однако он специально разработан для продвинутых алгоритмов рендеринга и имеет такие первоклассные функции, как замыкание яркости, BSDF и отложенную трассировку лучей.
OSL имеет несколько уникальных характеристик, которых нет в других языках шейдеров (конечно, не во всех вместе взятых). Вот некоторые особенности, которые вы обнаружите в OSL по сравнению с другими языками:
Шейдеры поверхности и объема вычисляют замыкание сияния, а не окончательные цвета.
Шейдеры поверхности и объема OSL вычисляют явное символическое описание, называемое «замыканием», того, как поверхность или объем рассеивают свет, в единицах яркости. Эти замыкания яркости можно оценивать в определенных направлениях, брать образцы для поиска важных направлений или сохранять для последующей оценки и повторной оценки. Этот новый подход идеально подходит для физического рендеринга, поддерживающего трассировку лучей и глобальное освещение.
Напротив, другие языки затенения обычно вычисляют только цвет поверхности, видимый с определенного направления. Эти старые шейдеры представляют собой «черные ящики», с которыми рендерер мало что может сделать, кроме как выполнить поиск этой единственной части информации (например, не существует эффективного способа узнать по ним, какие направления важны для выборки). Кроме того, физические единицы освещения и поверхностей часто недостаточно определены, что очень затрудняет обеспечение физически корректного поведения шейдеров.
Шейдеры поверхности и объема не зацикливаются на источниках света и не излучают лучи.
В поверхностных шейдерах OSL нет «световых петель» или явно прорисованных лучей освещения. Вместо этого шейдеры поверхности вычисляют замыкание излучения, описывающее, как поверхность рассеивает свет, а часть средства рендеринга, называемая «интегратором», оценивает замыкания для определенного набора источников света и определяет, в каких направлениях следует отслеживать лучи. Эффекты, которые обычно требуют явной трассировки лучей, такие как отражение и преломление, являются просто частью замыкания яркости и выглядят как любой другой BSDF.
Преимущества этого подхода включают в себя то, что интеграцию и выборку можно группировать или переупорядочивать для повышения когерентности лучей; «лучевой бюджет» может быть выделен для оптимальной выборки BSDF; затворы могут использоваться для двунаправленной трассировки лучей или легкового транспорта Metropolis; и замыкания можно быстро переоценить с новым освещением без необходимости повторного запуска шейдеров.
Шейдеры поверхности и света — это одно и то же.
OSL не имеет отдельного шейдера для источников света. Источники света — это просто излучающие поверхности, а все источники света — это площадные источники света.
Прозрачность — это просто еще один вид освещения.
Вам не нужно явно задавать переменные прозрачности/непрозрачности в шейдере. Прозрачность — это еще один способ взаимодействия света с поверхностью, который включен в основное замыкание яркости, вычисляемое поверхностным шейдером.
Выходные данные рендерера (AOV) могут быть указаны с использованием «выражений светового пути».
Иногда желательно выводить изображения, содержащие отдельные компоненты освещения, такие как зеркальное, рассеянное, отражение, отдельные источники света и т. д. В других языках это обычно достигается путем добавления множества «выходных переменных» к шейдерам, которые собирают эти отдельные величины.
Для этого не нужно загромождать шейдеры OSL каким-либо кодом или выходными переменными. Вместо этого существует нотация на основе регулярных выражений для описания того, какие пути света должны вносить вклад в какие выходные данные. Все это делается на стороне рендерера (хотя и поддерживается реализацией OSL). Если вам нужен новый результат, вообще нет необходимости изменять шейдеры; вам нужно только сообщить рендереру новое выражение пути света.
Шейдеры организованы в сети.
Шейдеры OSL не являются монолитными, а могут быть организованы в сети шейдеров (иногда называемые группой шейдеров, графом или DAG), при этом именованные выходы некоторых узлов соединяются с именованными входами других узлов в сети. Эти соединения могут выполняться динамически во время рендеринга и не влияют на компиляцию отдельных узлов шейдера. Более того, отдельные узлы оцениваются лениво, только тогда, когда их выходные данные «вытягиваются» из более поздних узлов, которые от них зависят (авторы шейдеров могут оставаться в блаженном неведении об этих деталях и писать шейдеры так, как будто все оценивается нормально).
Произвольные производные без сеток и дополнительных точек затенения.
В OSL вы можете брать производные от любой вычисленной величины в шейдере и использовать произвольные величины в качестве координат текстуры и ожидать корректной фильтрации. Для этого не требуется, чтобы заштрихованные точки располагались в прямоугольной сетке или имели какую-либо конкретную связность, или чтобы любые «лишние точки» были заштрихованы. Это связано с тем, что производные вычисляются не с помощью конечных разностей с соседними точками, а с помощью «автоматического дифференцирования», вычисляющего частные дифференциалы для переменных, которые приводят к производным, без какого-либо вмешательства со стороны автора шейдера.
OSL агрессивно оптимизирует время рендеринга
OSL использует структуру компилятора LLVM для перевода шейдерных сетей в машинный код на лету (точно во время или «JIT») и в процессе сильно оптимизирует шейдеры и сети с полным знанием параметров шейдеров и других значений времени выполнения, которые не могут быть были известны, когда шейдеры компилировались из исходного кода. В результате мы видим, что наши сети шейдеров OSL выполняются на 25% быстрее, чем эквивалентные шейдеры, созданные вручную на C! (Вот как наши старые шейдеры работали в нашем рендерере.)
Дистрибутив OSL с открытым исходным кодом состоит из следующих компонентов:
oslc — автономный компилятор, который преобразует исходный код OSL в промежуточный код, подобный ассемблеру (в виде файлов .oso).
liboslc, библиотека, реализующая класс OSLCompiler, содержащий все необходимое для компилятора шейдеров, на случай, если кому-то понадобится встроить его в другие приложения и не захочет, чтобы компилятор был отдельным исполняемым файлом.
liboslquery — библиотека, реализующая класс OSLQuery, который позволяет приложениям запрашивать информацию о скомпилированных шейдерах, включая полный список их параметров, их типов и любых метаданных, связанных с ними.
oslinfo — программа командной строки, которая использует liboslquery для вывода на консоль всей необходимой информации о шейдере и его параметрах.
liboslexec — библиотека, реализующая класс ShadingSystem, который позволяет выполнять скомпилированные шейдеры внутри приложения. В настоящее время он использует LLVM для JIT-компиляции байт-кода шейдера в инструкции x86.
testshade — программа, которая позволяет выполнять шейдер (или подключенную сеть шейдеров) для прямоугольного массива точек и сохранять любые его выходные данные в виде изображений. Это позволяет проверять шейдеры (и систему шейдеров) без необходимости интеграции в полнофункциональный рендерер и является основой для большей части наших проверок в наборе тестов. Наряду с testrender, testshade является хорошим примером вызова библиотек OSL.
testrender, крошечный рендерер с трассировкой лучей, использующий OSL для затенения. Возможности очень минимальны (в настоящее время разрешены только сферы), и производительности не уделялось внимания, но это демонстрирует, как библиотеки OSL могут быть интегрированы в работающий модуль визуализации, какие интерфейсы необходимо предоставить средству визуализации и как BSDF/ Закрытие сияния должно быть оценено и интегрировано (в том числе с выборкой множественной важности).
Несколько примеров шейдеров.
Документация — на данный момент состоит из спецификации языка OSL (полезно для разработчиков шейдеров), но в будущем будет подробная документация о том, как интегрировать библиотеки OSL в средства визуализации.
Этот список содержит только фильмы и продукты, использование OSL которых заявлено или может быть получено из общедоступных источников, или которые, как нам сказали, можно перечислить здесь. Если проект с использованием OSL отсутствует и это не секрет, просто напишите руководителю проекта OSL или отправьте запрос на внесение изменений в этот файл.
(Приблизительно в порядке добавления поддержки OSL)
(Здесь мы рассматриваем под «значительной работой» художественный фильм, выпущенный в кинотеатрах или на крупной потоковой платформе, телесериал или потоковый сериал, в котором много визуальных эффектов или анимации, или короткометражные фильмы, которые выиграли или были номинированы на крупные награды.)
Пожалуйста, прочтите файл INSTALL.md для получения подробных инструкций по сборке и установке OSL.
Спецификацию языка OSL можно найти по адресу src/doc/osl-languagespec.pdf (в исходном дистрибутиве) или в файле Share/doc/OSL/osl-languagespec.pdf установленного двоичного дистрибутива.
Экспериментальная документация OSL на ReadTheDocs Это будет будущая документация. Вероятно, он такой же полный, как и PDF, но требует некоторой корректуры, поэтому PDF на данный момент по-прежнему считается авторитетным источником. Но вскоре старая спецификация PDF будет устаревшей в пользу этой онлайн-документации.
Существует также PDF-версия.
Для тех, кто заинтересован в обучении программированию шейдеров в OSL, существует курс OSL Shaders for RenderMan на форуме преподавателей Siggraph 2022, в котором RenderMan используется в примерах и дополнительных материалах, но в основном посвящен написанию шейдеров в OSL.
Простые вопросы «как мне...», «у меня проблемы» или «это ошибка» лучше всего задавать в списке рассылки разработчиков osl-dev. Именно здесь большинство людей увидят это и потенциально смогут быстро ответить на ваш вопрос (в большей степени, чем «проблема» GH).
Об ошибках, проблемах сборки и обнаруженных уязвимостях, которые, по вашему мнению, являются реальной проблемой в коде и для которых вы можете дать четкие инструкции по воспроизведению, следует сообщать как о проблемах.
Если вы считаете, что обнаружили потенциальную уязвимость в OSL, конфиденциально сообщите об этом, отправив электронное письмо администраторам проекта по адресу [email protected].
Если какой-либо другой вопрос требует конфиденциальности, исключающей публичный вопрос или проблему, вы можете связаться с администратором проекта лично по адресу [email protected].
OSL приветствует участие в написании кода, и за эти годы это сделали почти 50 человек. Мы принимаем участие в коде через обычный механизм запроса на извлечение (PR) GitHub. Пожалуйста, ознакомьтесь с подробными инструкциями.
Страница OSL на GitHub
Прочитайте или подпишитесь на список рассылки разработчиков OSL
Последний PDF-файл со спецификацией языка OSL.
Домашняя страница ОСЛ
Текущее руководство проектом задокументировано в файле управления.
За прошедшие годы многие люди внесли в OSL функции, исправления ошибок и другие изменения: Стив Агланд, Шейн Эмблер, Мартейн Бергер, Фархад Бидголирад, Николас Бишоп, Кертис Блэк, Расмус Боннедал, Соломон Булос, Стефан Брюэнс, Стефан Бюттнер, Маттеус Дж. Чайдас, Кларк Чен, Мехди Чинун, Алехандро Конти, Дэмьен Куртуа, Дитер Де Баетс, Томас Дингес, Дэниэл Дрессер, Мэдс Дрёшлер, Питер Эллерингтон, Люк Эмроуз, Луис Фэн, Марк Финал, Анри Фусс, Стивен Фридман, Сойо Фудзита, Тим. Грант, Ларри Гриц, Николя Гьяр, Юан Хаар, Дерек Хаазе, Свен-Хендрик Хаасе, Джон Хэддон, Никлас Харриссон, Дэниэл Хекенберг, Крис Хельмут, Адриан Херубель, Дэн Хорак, Тьяго Изе, Мэтт Джонсон, Ронан Кериелл, Крис Кулла, Элвик Лян, Макс Лиани, Адам Мартинес, Джон Мертик, Бастьен Монтань, Стина Монтейро, Патрик Мурс, Алексис Облет, Эрих Оушен, Микко Отамаа, Джино Парк, Алексей Павлоу, Митч Пратер, Джей Рейнольдс, Деклан Рассел, Бенуа Руис, Патрик Шайбе, Алекс Шворер, Джонатан Скраггс, Сергей Шарыбин, Марк Сиссон, Сандип Шукла, Клифф Стейн, Стефан Стейнбах, Луя Чимбаланга, Эстебан Товаляри, Брехт Ван Ломмель, Тибо Вернь, Александр фон Кнорринг, Эйдан Уэлч, Алекс Уэллс, Роман Зулак. (Перечислены в алфавитном порядке; если мы кого-то упустили, это произошло по ошибке, сообщите нам об этом.)
Мы не можем выразить достаточную благодарность менеджерам Sony Pictures Imageworks, которые позволили этому проекту продолжиться, всецело поддержали его и разрешили нам опубликовать исходный код, особенно Робу Бредоу, Брайану Кини, Барбаре Форд, Рене Лимбергеру, Эрику Штраусу и Майку. Форд.
Огромное спасибо также команде SPI, занимающейся шейдерами, а также смелым техническим специалистам по взглядам и специалистам по компьютерной графике, желающим использовать OSL в своих шоу. Они служили нам подопытными кроликами, вдохновителями, тестировщиками и фантастическим источником обратной связи. И, конечно же, многие инженеры, технические специалисты и художники из других стран, которые включили OSL в свои продукты и конвейеры, особенно те, кто первым пошел на риск в Chaos Group, Double Negative, Pixar, DNA, Isotropix и Animal Logic. Благодарим вас и надеемся, что мы откликнулись на ваши потребности.
OSL не разрабатывался изолированно. Мы в долгу перед отдельными людьми и студиями, которые терпеливо читали ранние черновики спецификации языка и давали нам очень полезные отзывы и дополнительные идеи, а также перед постоянным вкладом и отзывами нынешних разработчиков и пользователей в других студиях визуальных эффектов и анимации.
Реализация OSL зависит от нескольких других пакетов с открытым исходным кодом, все с совместимыми лицензиями:
Документация OSL включает части Markdeep (c) 2015-2016, Morgan McGuire и Highlight.js (c) 2006, Иван Сагалаев, оба распространяются по лицензиям BSD.