Vex гудини что это

Houdini: VOP&VEX

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Управление VEX реализовано посредством одноименного языка программирования. Но многим VEX знаком в основном возможностью собирать необходимый инструментарий нодами в VOP контексте. Возможности VOP очень широки, но они не идут ни в какое сравнение с гибкостью и лёгкостью, которую даёт умение писать программы непосредственно на самом языке VEX.

Этот курс про программирование. Он предназначен для тех, кто хотел бы прокачать свои навыки в Houdini и абстрактно в программировании как таковом.

Краткая программа курса

БЛОК 1: Как работает VEX.

Специфика инструментария и круг решаемых задач. Ноды и код (VOP и VEX). Структура языка VEX. Комфортная работа с кодом и справкой. Практика разработки алгоритмов для простых задач.

БЛОК 2: Next level. Реальные задачи.

Возможности VEX, как процедурного языка программирования. Реализация сложных примеров для различных контекстов.

БЛОК 3: Ограничения движка.

Взаимоотношения с «конкурентами» (hscript, python, openCL) Кастомизация и расширение возможностей.

Информация о курсе

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Результат курса: Сертификат, знания, разработки.

Длительность курса: 3 месяца

Стоимость обучения : 15.000 руб. в месяц

Требования к слушателям: знание Houdini на начальном/среднем уровне. Знакомство с VEX на уровне нодового билдера приветствуется.

Занятия проходят по субботам, три раза в месяц. Длительность каждого занятия составляет от 2.5 до 3.5 часов.

Видеозапись каждого занятия предоставляется слушателям в качестве конспекта.

Минимально допустимая скорость подключения к интернету у слушателей курса 512kb/s.

Дата запуска курса: 24 апреля, 2021

Запись на курс: открыта

Отзывы наших слушателей о курсе

Шикарный курс для тех, кто решился подтянуть технические навыки. Будет полезен любым фанатам Гудини, начинающим и продвинутым, технически подкованным и далеким от математики.

Главное достоинство — полнота охвата материала, вы будете знать все о программировани и в Гудини, VEX, Python, SDK освящаются в достаточной мере. Основной упор направлен на самый ходовой инструмент — VEX.

Глубина погружения в материал тоже вне конкуренции, начиная с базовых и простых вещей вы доберетесь до самых основ работы с геометрией, пространством, шейдерами и поймете как 3д выглядит в чистом виде и воплощается при помощи математики.

Не стоит думать, что программировани е это удел людей с особым складом ума, при должном усердии этот навык доступен всем и Стас вам поможет сделать первые шаги.

Это интересное и увлекательное путешествие и я могу только позавидовать тем, у кого оно ещё впереди!

Источник

Houdinibook

Изучаем Houdini на русском языке

Уроки HOUDINI

Часть 8 VEX и VOPs в Houdini

В этой главе мы исследуем несколько полезных подсказок, которые помогут вам в работе с этими инструментами.

Содержание 8 главы:
Шахматная доска

Быстро создать шахматный pattern можно используя Boxes VOP. Если вы определите номер слоев к 2, вы очень просто получите шахматную доску. Вот эти шаги:

• В контексте VOPs, создайте VEX Surface Shader. Зайдите внутрь.

• Создайте Boxes VOP. Щелкните средней кнопкой мыши (MMB) на входе sfreq, и сделайте это параметром. Сделайте то же самое с tfreq.

• Создайте Colormix VOP. Подсоедините выход «amount» Boxes к параметру «bias» Colormix.

• MMB на входе «primary» Colormix, и сделайте это параметром. Сделайте то же самое с параметром «secondary».

• Соедините выход «clr» узла Colormix с входом Cf выходного узла.

Вернитесь на уровень VOP и щелкните правой кнопкой мыши (RMB) по узлу Surface Shader. Выберите “Create New Shop from Vop Network.” Затем идите в SHOPs и используйте свой новый шейдер.

Использование Color Mix VOP, заключается в том, чтобы выбирать между двумя цветами. Еще в этом примере мы добавили параметр, чтобы управлять частотой полей.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Не векторные атрибуты Color

Цвета в VEX определены как векторный тип данных, а не как float[3]. Вы должны делать все возможное не позволить этому аффекту помешать, когда дело доходит до добавления дополнительных атрибутов геометрии, используя AttribCreate SOP. Вы можете захотеть добавить атрибут, чтобы представить цвет, используя векторный тип данных в SOP, что позже может вызвать ошибку, если вы сделате некоторые преобразования на геометрии (используя Transform SOP, например).

Любые преобразования также преобразуют векторные атрибуты и повреждают информацию о цвете, которая, очевидно, не предназначена, чтобы быть измененной во время преобразования. Преобразования будут изменять векторные типы, чтобы предоставить истинную информацию о векторе, а векторы скорости, и нормали оставались правильными. Так что позаботьтесь о том, чтобы создать float[3] типы данных для информации о цвете в AttribCreate SOP и огородить себя от этих проблем.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Использование меньшего количества памяти

Для лучшего интерактивного отображения вы можете использовать “texcache-r”, чтобы уменьшить разрешение текстур, показываемых в области 3D просмотра. Просто откройте textport и введите команду.

Имена параметров

Зачастую появляется необходимость создать шейдер, который берет имя параметра, присутствующего в поступающей геометрии. Например, вашему шейдеру, для работы понадобилась нормаль, и вы хотели бы позволить странице параметров определять нормаль, которая будет переопределена, если у геометрии будет нормаль.

VOPs будет автоматически использовать существующие атрибуты как Normal, чтобы переопределить безотносительно настроек, которые вы можете иметь в параметрах своего шейдера. Но что, если у вашего шейдера есть пользовательский параметр, и вы хотите позволить шейдеру использовать этот атрибут непосредственно, если он существует?

Это довольно легко. Просто вернитесь к сети VOP, создающей шейдер, и в Parameter VOP для обоих Primary и Secondary, проверьте флажок “Use Input Value If Parameter Not Bound.”

Теперь убедитесь, что это работает, создав некоторую геометрию в Surface Operators (SOPs), добавив AttribCreate SOP, и назвав атрибут «secondary». Измените Type на Vector, и затем установите значение RGB в областях Value. Если вы назначите свой шейдер на эту геометрию, и выполните рендеринг с mantra, вы увидите, что ваш новый цвет переопределяет тот в установках параметров шейдера.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Оптимизаия Ray Tracing

Если вы создаете шейдер, который использует ray tracing, вы можете оптимизировать его, включив параметр rcolor (отраженный цвет). Если цвет будет близко к черному, то отражения не будут вносить цвета, и могут быть пропущены. Как базовая установка, это означает:

• Соедините цвет с Length VOP. Если у вас уже нет цвета как вектора, вы должны будете сначала преобразовать его используя FloatToVector VOP.

• Создайте Constant VOP, и установите его на Float, со значением 0.01. Мы используем это маленькое число, а не абсолютный ноль, потому что мы также хотим поймать вещи, которые близки к нолю. Позже вы можете корректировать это значение.

• Создайте Compare VOP. Соедините Length с input1, и Constant к input2. Установите Test в Less Than or Equal.

• Создайте If VOP. Подсоедините выход Compare к входу «condition». Установите Condition в False. Соедините вектор rcolor с коннектором «next» входа If.

Теперь вы поместили бы свой RayTrace VOP и другие связанные операторы в If VOP. Они были бы выполнены, если, If утверждение было истиной (то есть, если rcolor был достаточно большим, чтобы отслеживать отраженные лучи). В противном случае rcolor был бы передан прямо через If. Так или иначе, выход If VOP был бы компонентом, который вы добавите для своих отражений.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Максимальная дистанция для лучей Mantra

Если вы хотите создать шейдер mantra, который не станет освещать поверхности, которые находятся слишком далеко, вы можете использовать параметр “maxdist”. Все функции рейтрейсинга в VEX принимают дополнительный параметр “maxdist”, который может использоваться, чтобы установить максимальное расстояние трассировки лучей. Например:

rayhittest(P, N, 0.01, “maxdist”, 100);

Определение категорий

В Houdini 9, все функции illumination и трассировки теперь полуили дополнительный ключевой аргумент «categories», который получает ключевое выражение как параметр. Например:

diffuse(nn, “categories”, “-global”);

вычислит значение диффузности от всех источников света, у которых нет ключевого определения «global».

gather(p, d, “categories”, “background”);

вычислит gather всех объектов с тегом «background».

Подсказки Pragma

Несколько полезных #pragma hint подсказок, которые вы можете использовать со своим кодом VEX. Во первых, вы можете использовать недокументированное #pragma hint nolabel, чтобы создать параметр без метки. Вы можете объединить это с #pragma hint joinnext, который присоединится к двум параметрам в одной линии. Вы можете также использовать #pragma choice создавая пункты меню. Создайте файл со следующим кодом и назовите его foo.vfl.

#pragma hint a joinnext

#pragma hint b nolabel

#pragma label a “This is A”

#pragma label b “and B”

// The next two lines make ‘b’ a menu with two choices

#pragma choice b 0 “optionb0”

#pragma choice b 1 “optionb1”

sop foo(float a=1; float b=0;)

Затем компилируйте и запустите это с

В редакторе SOP, в tab меню вы должны найти “foo”, и когда вы создадите foo SOP, вы получите это.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

#pragma hint a joinnext

#pragma hint b nolabel

#pragma label a “This is A”

#pragma label b “and B”

#pragma choice a 0 “optiona1” //

make ‘a’ a menu parameter

#pragma choice a 1 “optiona2”

#pragma choice b 0 “optionb0”

#pragma choice b 1 “optionb1”

sop bar(float a=1; float b=0;)

Компилирование вышеупомянутого и раскрытие создаваемого узла, дают вам это

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Конвертирование VEX в RenderMan

Было бы не плохо иметь возможность написать шейдеры только один раз, и затем собрать их с VEX или с RenderMan компиляторами. К сожалению, вы не можете действительно сделать этого, по крайней мере не в общем случае.

Но вы можете написать функцию VEX, используя ifdefs, и выполнить vcc, чтобы генерировать файл диалога сценария (.ds), или файл Operator Type Library (OTL). Это скрыло бы VEX #pragma инструкции от компилятора prman, который не понимает их. Затем, как только вы в состоянии собрать шейдер для обоих языков, вы можете использовать rendermask pragma, чтобы определить, что шейдер запускается в обоих рендерах. Например:

#pragma rendermask “VMantra,RIB”

#pragma label diff “Diffuse”

shader( color diff = 1;)

normal nn = normalize(faceforward(N, I));

Ci = diffuse(nn) * diff;

Этот шейдер должен компилироваться и с prman и с VEX. Вы можете создать OTL для Shader Operator (SHOP), используя vcc, но использовать SHOP для prman или для VEX.

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

Суммирование цикла

Как образовав цикл некоторых значений, накопить общее количество? Используете значение “accum”, чтобы передать накопленную сумму вперед и назад. Вот простой пример:

• В сети VOP, создайте узел VEX Geometry Operator. Мы собираемся создать SOP, который берет ряд входящих точек, и вычисляет среднюю локацию (среднюю точку) всех их. В результате все точки во входящей геометрии, переместятся в среднюю точку всех этих точек.

• В новом VOP, создайте узел For Loop, узел Global Variables, и узел Constant.

• Установите тип узла Constant в Vector, и измените Constant Name на “accum” (без кавычек).

• Соедините коннектор “Npt” узла Global Variables, к коннектору «end» оператора For Loop.

• Соедините оператор Constant с входом «next» оператора For Loop.

• Выберите оператор For Loop и нажмите enter, чтобы зайти в него.

• Создайте узел Subnet Input, узел Add, и узел Import Attribute.

• Соедините выход “accum” узла Subnet Input к коннектору “input1” узла Add. Соедините выход «sum» узла Add к входу “accum” узла Subnet Output.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

• Установите Attribute в операторе Import Attribute на “P” (без кавычек).

• Соедините выход “i” узла Subnet Input с входом “ptnum” узла Import Attribute. Соедините выход “adata” узла Import Attribute с коннектором “input2” оператора Add. Поднимитесь на один уровень (используйте горячую клавишу “u”).

• Создайте Divide VOP, и соедините “input1” с выходом оператора ForLoop. Соедините “input2” с коннектором “Npt” узла Global Variables. Соедините выход “div” со входом “P” оператора Output.

Цветные тени

Представим что, у вас есть непрозрачный объект, и вы хотите чтобы он отбрасывал зеленую тень, вместо черной. Вот три варианта рендеринга цветной тени, используя mantra:

1. Создайте два источника света, связанные (parented) друг с другом. Один пусть отбрасывает тени, а другой нет. Измените цвета источников света так, чтобы смешиваясь они давали нужный цвет. Например, чтобы получить зеленую тень, установите источник света с тенью на (1, 0, 1), а источник света без тени на (0, 1, 0). В этом случае, зеленый свет пройдет через любые объекты, и они будут отбрасывать зеленые тени.

2. Создайте пользовательский шейдер тени. Вы можете запросить цвет источника света прежде, чем тени будут отброшены, вычислить тени, и затем смешать оригинальный цвет и цвет тени. Например,

// Compute normal shadow color, for example:

Cl *= lerp(fastshadow(Ps, L, bias), 1, fill_amount);

// Then blend to desired color

Cl=(Cl_org – Cl) * shadow_clr + Cl;

3. Измените surface shader так, чтобы объект стал прозрачным только для теней. Это отличается от двух первых вариантов тем, что каждая поверхность, через которую проходит источник света, может иметь разную цветную тень.

// If this object is being tested to see if it

// casts a shadow, return a transparent colored

// Compute normal surface color

Отметьте, что для работы этой третьей схемы, источник света дающий, тени нужно было присоединить шейдер к тому что управляет прозрачными объектами.

Управление опциями компилятора

Есть теперь запасное свойство, которое может быть добавлено к vopnets, чтобы управлять компилятором и опциями компилятора. Чтобы увидеть это, зайдите в /vex и создайте VEX Surface Shader, который по умолчанию назван surface1. Затем откройте textport (горячая клавиша: alt-T), и в нем введите следующее:

opproperty /vex/surface1 vopnet vcc_compiler

В области параметров вашего surface1 узла появится новая вкладка Compiler. Загляните в эту вкладку, и увидите определенную Compiler команду.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Есть 4 локальные переменные, которые определяют свойства vop_compiler:

Есть запасные свойства, определенные для vopnets, которые можно добавить, используя команду opproperty:

opproperty /vex/path/to/vopnet vopnet vcc_compiler

opproperty /vex/path/to/vopnet vopnet prman_compiler

И вы должны быть в состоянии сделать это в интерактивном режиме, щелкнув RMB на узле сети VOP, и выбрав “Edit Parameter Interface.” Затем зайдите во вкладку Optional Rendering Parameters, и откройте папку vopnet. Затем RMB на Compiler входе внутрь, и установите параметры.

Просмотр примера кода VEX

У всех шейдеров Mantra, которые поставляются вместе с Houdini, есть доступный VEX код, который очень полезен для того, чтобы узнать как были сделаны эти шейдер. Чтобы увидеть VEX код любого VEX шейдера, зайдите в SHOPs и создайте инстанцию шейдера. Затем RMB на иконке шейдера, и выберите “Operator Type Properties.” Когда откроется диалог, зайдите во вкладку VEX Code, и вы на месте.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Пользовательские заголовки
If Then Else (ЕслиЗатемЕще)

Во первых можно скопировать и вставить, «If» VOP и реверсировать входы, сопровождаемые Switch VOP с таким же испытательным условием.

Во вторых можно использовать Inline Code VOP, чтобы кодировать условие в VEX. Заметьте, что, если вы создаете оператор с большим количеством условий, то легче написать все это в VEX и создать из этого VOP.

Шейдеры BRDF

Mantra 9 поддерживает вычисления BRDF шейдинга. Вы можете получить пример того, на что это похоже в VEX шейдере. В SHOPs создайте VEX Metal шейдер, RMB на узле, и выберите Type Properties. В диалоге, который открывается, зайдите во вкладку VEX Code. Там есть источник, и видно, какие используются вычисления BRDF, назначая результат на F компонент шейдера.

Вы увидите, что это осуществило в VOPs, создайте Surface Shader VOP, и затем зайдите внутрь. Блок Output, который там появился, содержит F, который вы использовали бы, чтобы назначить результат вычислений, показанных в источнике шейдера.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Добавление выходов к подсетям

Представьте что вы создаете подсеть шейдеров, и вы хотите добавить один или более выходов к этой подсети. Можно использовать Parameter VOP, чтобы создать их, но это не лучший способ.

Вместо этого просто сделайте новое соединение с Subnet Output VOP (соедините что-то со входом «next»). Затем, чтобы изменить название выхода, загляните в диалог параметра для Subnet Output VOP. Вы увидите небольшую таблицу, где можно отредактировать имена (и описания для раскрывающейся справки) выходов.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Сокрытие неиспользуемых типов шейдеров

в ваш файл 123.cmd, вы не будите видеть все шейдеры для рендеров, которых у вас нет. Альтернативно,

будет означать, что будут видны только ваши Mental Images шейдеры.

Используйте +, чтобы снова сделать их видимыми, например,

Конечно, вы также можете просто ввести эти команды в Houdini textport. И вы можете использовать команду отдельно, без параметров, чтобы видеть, какие ваши текущие настройки.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

In-Line сети VOP

В Houdini 8, вы могли создать сеть VOP в сети SOP, или в сети composite, но когда вы сделали это, вы все еще могли RMB на сетевом узле, и создать SOP или COP из вашей сети VOP.

И все же если вы позже передумали, и хотите превратить эту сеть VOP в новый тип узла SOP, вы можете RMB на узле и выбирать Convert.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Время SHOP

Чтобы создать шейдер (или другой оператор), который использует текущее время, или номер кадра, как вход, просто создайте Parameter VOP, и установите его Type в Float. Установите Parameter Name, на «time» и Parameter Label на «Time».

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Второй вход

Если вы создаете SOP, используя VEX Geometry Operator, то его можно установить так, чтобы он имел больше чем один вход. Но в вашей сети VOP, вы увидите, что Global Variables VOP доступы только значения от первого входа SOP. Чтобы получить значения от второго входа, вы должны использовать Import Attribute VOP.

Кроме того, если вы хотите получить количество точек от второго входа, то сделайте это:

• Создайте Parameter VOP

• Установите его, чтобы он был Invisible

• Установите в значение Integer Default выражение:

npoints(“../” + opinput(“.”, 1))

что даст вам количество точек во втором входе (они пронумерованы от 0).

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Inline Code

Если вы хотите получить доступ к функции VEX, которой нельзя было бы создать VOP для этого, или возможно пользовательскую функцию VEX, написанную в HDK, вы можете использовать Inline Code VOP. Он имеет хорошую справку, но здесь быстрым резюме, используя функцию VEX “computenormals:”

• Создайте InLine Code VOP. Установите Output 1 Type в Vector, и назовите это “out” (без кавычек).

• Подсоедините в любой вход который вы хотите. Для computenormals мы хотим питаться в P, так сделайте это от Global Variables VOP. Соедините выход P с входом «next» Inline.

• В поле текста Inline VEX Code, введите эту строку:

Отметьте, что в конце утверждения стоит точка с запятой. Независимо от того, что входит, должна быть допустимая строка (или строки) VEX кода. Это включает строки с точками с запятой в конце.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Управление параметрами

Когда вы будете использовать VOPs, чтобы создавать пользовательские операторы, вы, вероятно, создадите много параметров, которые ваш оператор предоставит пользователю. Конечно желательно разместить их в разумном порядке, и группировать во вкладки. Вы можете сделать все это в интерактивном режиме.

Как пример, создайте VEX Surface Shader VOP, и зайдите внутрь него. MMB на первых 3 или 4 выходных метках, и превратите их в параметры. Это должно дать вам ряд параметров, для работы с ними. Теперь возвратитесь на уровень VOPs, и посмотрите в область параметров этого VOP. У вас должно получиться как на изображении.

Vex гудини что это. Смотреть фото Vex гудини что это. Смотреть картинку Vex гудини что это. Картинка про Vex гудини что это. Фото Vex гудини что это

Теперь вы можете переупорядочить параметры, щелкая по стрелке вверх рядом с именем. Или, лучше, вы можете перетащить название параметра куда-нибудь в список.

Следующим шагом, нужно организовать их в папки. Чтобы сделать это, выберите первые два параметра (выберите один, затем shift-LMB на втором). Щелкните по небольшому треугольнику в правом краю выбранных параметров, и вы увидите, что они группируются во вкладку, показанную фигурными скобками. Вы можете щелкнуть по имени по умолчанию вкладки (“New Group”) и изменить это на что-то своё.

Наконец, вы можете удалить группу вкладки, щелкнув по красному X в правом конце строки с фигурной скобкой. Следующее изображение показывает эти организованные параметры. И второе изображение показывает полученный результат в области параметров.

Источник

Справка по языку VEX

Сведения о синтаксисе VEX, типах данных и т.д.

Контексты

VEX программы пишутся для конкретных контекстов. Например, шейдер, который управляет цветом поверхности объекта, должен быть написан для контекста поверхности (surface). Шейдер, определяющий освещенность светом, написан для контекста света (light). VEX программа, которая создает или фильтрует данные канала, записывается для контекста анимационных каналов (CHOP).

Контекст влияет на то, какие функции, операторы и глобальные переменные доступны.

Смотрите контексты VEX для понимания того, как вы можете использовать VEX.

Если вы пишете для шейдинг контекста (surface, displacement, light и т.д.), вам также необходимо ознакомиться с информацией о шейдинг контексте.

Операторы

VEX поддерживает операторы привычные из языка C. Он также поддерживает специальные шейдинг операторы, такие как illuminance и gather циклы, которые доступны только в определенных контекстах.

Встроенные функции

VEX имеет большую библиотеку встроенных функций. Некоторые функции доступны только в определенных контекстах.

Пользовательские функции

Функции определяются аналогично языку C: укажите тип возвращаемого значения, имя функции и список аргументов в скобках, за которым следует блок кода.

Аргументы одного типа могут быть объявлены в списке, разделенном запятыми, без повторного объявления типа. Другие аргументы должны быть разделены точкой с запятой.

Вы можете перегружать функции с тем же именем, но разными наборами аргументов и/или возвращаемым типом.

Вы можете ввести определение функции с необязательным ключевым словом function, чтобы избежать неоднозначности типа.

Заметки

Пользовательские функции должны быть объявлены до первой ссылки на них.

Эти функции автоматически компилируются компилятором, поэтому рекурсия не будет работать. Чтобы написать рекурсивный алгоритм, вы должны использовать шейдерные вызовы.

Количество пользовательских функций не ограничено

Вы можете иметь более одного оператора возврата return в функции.

Вы можете напрямую обращаться к глобальным переменным (в отличие от RenderMan Shading Language, вам не нужно объявлять их с помощью extern ). Однако мы рекомендуем избегать доступа к глобальным переменным, поскольку это ограничивает вашу функцию работой только в одном контексте (там, где существуют эти глобальные переменные). Вместо этого передайте глобальные переменные функции в качестве параметров.

Функции могут быть определены внутри функции (вложенные функции).

Основная (контекстная) функция

VEX программа должна содержать одну функцию, тип возврата которой является именем контекста. Это основная функция программы, которая вызывается Мантрой. Компилятор ожидает одну контекстную функцию для каждого файла.

Эта функция должна выполнять работу (вызывая встроенные и/или пользовательские функции) вычисления любой требуемой информации и измененять глобальные переменные. Вы не используете оператор возврата return для возврата значения из контекстной функции. Смотрите контексты, чтобы узнать список доступных глобальных переменных для каждого контекста.

Аргументы контекстных функций, если таковые имеются, становятся пользовательским интерфейсом для программы, например, параметрами затеняющей ноды, которая ссылается на VEX программу.

Если атрибут геометрии существует с тем же именем, что и параметр контекстной функции, атрибут переопределяет значение параметра. Это позволяет рисовать атрибуты на геометрии для управления VEX кодом.

Параметры контекстных функций обрабатываются VEX особым образом. Можно переопределить значение параметра, используя атрибут геометрии с тем же именем, что и переменная. Помимо этого специального случая, параметры следует рассматривать как «константные» в области видимости шейдера. Это означает, что изменять значение параметра запрещено. Компилятор будет возвращать ошибки, если это произойдет.

Ключевое слово export можно использовать для определения параметров, которые вы хотите изменить в исходной геометрии.

Псевдокомментарии пользовательского интерфейса (Pragmas)

Пользовательский интерфейс, созданный из этой программы Houdini, будет минимальным, в основном просто имя переменной и общее текстовое поле, основанное на типе данных. Например, вы можете указать, что frequency (частота) должна быть слайдером с определенным диапазоном, и что clr следует рассматривать в качестве цвета (предоставляя ему интерфейс выбора цвета). Вы можете сделать это с помощью псевдокомментариев пользовательского интерфейса компилятора.

Операции

VEX имеет стандартные операции языка C с тем же старшинством, но со следующими отличиями.

Умножение определено между двумя векторами или точками. Умножение выполняется поэлементно, а не скалярное или векторное произведение, см. dot и cross.

Много операций определено для нескалярных типов данных (т.е. вектор умноженный на матрицу, трансформирует вектор по матрице).

В неоднозначных ситуациях, когда вы объединяете два разных типа с операцией, результат имеет тип второго (правая сторона) значения, например

Операция точка

Для векторов имена компонентов фиксированы.

Выбор букв u,v/x,y,z/r,g,b произволен; те же буквы применяются даже если вектор не содержит точку или цвет.

Для матриц вы можете использовать пары букв:

.xx для ссылки на [0][0] элемент

.zz для ссылки на [2][2] элемент

.ax для ссылки на [3][0] элемент

В дополнение, операция точка может использоваться для перестановки ( swizzle ) компонентов вектора. Например:

v.zyx эквивалентно set(v.z, v.y, v.x)

v4.bgab эквивалентно set(v4.b, v4.g, v4.a, v4.b)

Сравнения

) операции определены только для целых чисел.

Таблица старшинства (или приоритетов)

Операции расположенные выше в таблице имеют более высокий приоритет.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *