Пользовательская камера (custom camera)¶
Помимо встроенных типов камер (перспективные, ортографические и панорамные камеры), Cycles также поддерживает реализацию пользовательских камер с использованием Open Shading Language (OSL).
Пользовательские камеры реализованы в качестве шейдеров OSL. Шейдер камеры получает положение датчика в качестве входных данных и выводит соответствующее положение луча, направление и пропускную способность.
OSL для затенения и пользовательские камеры являются независимыми, поэтому последние можно использовать даже при отключённом затенении OSL.
Использование пользовательских камер¶
In order to use a custom camera, set the Lens Type to Custom.
Это позволит нам выбирать текстовый блок данных или внешний файл, аналогично ноде Script в шейдерах.
Если выбранный шейдер камеры будет иметь параметры, они отобразятся под панелью „Объектив“.
Написание шейдеров камеры¶
Входы (inputs)¶
Первичным входом для шейдера камеры является положение сенсора. Это обеспечивается функцией camera_shader_raster_position(), которая возвращает точку, компоненты X и Y которой хранят положение в пределах изображения в диапазоне 0-1.
Для поддержки в шейдере случайного сэмплинга, – предоставляется пара случайных чисел через функцию camera_shader_random_sample(), которая возвращает вектор, содержащий случайные числа в компонентах X и Y. Для конкретного случая сэмплинга апертуры лучше использовать атрибут cam:aperture_position (см. ниже) для совместимости с обычными параметрами апертуры Blender’а.
Выходы (outputs)¶
- Шейдер должен выводить три переменные:
position, переменная типаpoint, которая содержит ориджин генерируемого луча.direction, переменная типаvector, которая содержит нормализованное направление генерируемого луча.throughput, переменная типаcolor, которая содержит пропускную способность луча - коэффициент влияния
который можно использовать для затемнения или придания оттенка результирующему цвету, воспринимаемому камерой.
И position, и direction выражаются в координатах камеры, где начало координат – это положение самой камеры, положительная ось Z – это направление обзора, а положительная ось Y – является осью «вверх».
Если throughput чёрный, – результирующий луч пропускается. Это можно использовать, например, для указания недействительных лучей для панорамных отображений.
Атрибуты (attributes)¶
Поскольку шейдеры камеры не являются шейдерами в традиционном смысле, в них отсутствуют многие функции OSL, такие как замыкания или атрибуты, связанные с геометрией.
Вместо этого через getattribute() доступны следующие атрибуты, специфичные для камеры:
cam:sensor_sizeРазмер сенсора камеры в миллиметрах, как указано в свойствах самой камеры.
cam:image_resolutionРазрешение отрендеренного изображения.
cam:focal_distanceФокусное расстояние камеры в миллиметрах, как установлено в свойствах глубины резкости.
cam:aperture_aspect_ratioСоотношение сторон апертуры камеры, заданное в свойствах глубины резкости.
cam:aperture_sizeРазмер апертуры камеры, установленный в свойствах глубины резкости.
cam:aperture_positionСлучайное положение на апертуре, принимая во внимание её размер, форму и соотношение сторон, как установлено в свойствах глубины резкости. Обратите внимание, что здесь используются те же случайные числа, что предоставляются с „camera_shader_random_sample()“, поэтому избегайте использования сразу обоих, так как это приведёт к проблемам корреляции.
Производные¶
Для некоторых функций, таких как нода Wireframe, для Cycles требуются производные от ориджина и направления луча относительно координат X и Y изображения.
По умолчанию для их вычисления будет использоваться автодифференциация OSL. Для сложных случаев, когда вы можете вычислять производные точнее или эффективнее, вы можете сделать так, чтобы ваш шейдер выводил четыре дополнительные переменные с именами dPdx, dPdy, dDdx и dDdy. Если какие-либо из них будут присутствовать, – вместо них будут использоваться их же значения. Обратите внимание, что вы не можете смешивать оба варианта – явно указываться должны либо все, либо ни один из них.
Параметры¶
Шейдеры могут определять дополнительные входные параметры. Они будут представлены пользователю на панели свойств камеры в параметрах объектива.
Для дальнейшего управления представлением можно использовать следующие метаданные OSL:
[[ string help = "Это параметр" ]]Описание параметра, отображаемое во всплывающем окне-подсказке.
[[ float sensitivity = 0.25 ]]Насколько следует увеличивать/уменьшать параметр при перетаскивании/щелчке.
[[ int digits = 2 ]]Сколько цифр будет отображаться для числовых параметров.
[[ float min = -5, float max = 5 ]]Какой диапазон может выдержать свойство.
[[ int slider = 1, float slidermin = -4, float slidermax = 4 ]]Отобразить свойство в виде ползунка с заданным диапазоном.
[[ string widget = "boolean" ]]Отобразить свойство
`int`в качестве флажка ( / ), выдающего значения „0“ или „1“.
Пример¶
Здесь мы имеем самый базовый шейдер, который реализует перспективную камеру:
shader perspective_camera(
float focal_length = 90.0 [[ float sensitivity = 0.2, float min = 0 ]],
output point position = 0.0,
output vector direction = 0.0,
output color throughput = 1.0) {
vector sensor_size;
getattribute("cam:sensor_size", sensor_size);
point Pcam = camera_shader_raster_position() - point(0.5);
Pcam *= sensor_size / focal_length;
direction = normalize(vector(Pcam.x, Pcam.y, 1.0));
}
Больше примеров можно найти в .
Ограничения¶
Важно
Пользовательские камеры не поддерживают рендеринг на GPU, если не используется бэкэнд OptiX.
Некоторые функции в Cycles, в частности, проход „Vector“ и координаты текстуры окна, требуют обратных сопоставлений от лучей в координаты изображения. Пользовательскими камерами – это пока не поддерживается.