Пользовательская камера (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));
}

Больше примеров можно найти в Текстовый редактор ‣ Шаблоны ‣ Open Shading Language Text Editor ‣ Templates ‣ Open Shading Language.

Ограничения

Важно

Пользовательские камеры не поддерживают рендеринг на GPU, если не используется бэкэнд OptiX.

Некоторые функции в Cycles, в частности, проход „Vector“ и координаты текстуры окна, требуют обратных сопоставлений от лучей в координаты изображения. Пользовательскими камерами – это пока не поддерживается.