Caméra personnalisée

En plus des types de caméras intégrées (caméras perspective, orthographique et panoramique), Cycles prend également en charge la mise en œuvre de caméras personnalisées à l’aide de Open Shading Language (OSL).

Les caméras personnalisées sont implémentées en tant que shaders OSL. Un shader de caméra reçoit une position de capteur en entrée et émet la position, la direction et le débit du rayon correspondant.

L’OSL pour l’ombrage et les caméras personnalisées sont indépendants, de sorte que ces dernières peuvent être utilisées même lorsque l’ombrage OSL est désactivé.

Utilisation de caméras personnalisées

Pour utiliser une caméra personnalisée, réglez le type d’objectif sur Custom.

Cela permet de sélectionner un bloc de données texte ou un fichier externe, similaire au Script node dans les shaders.

Si le shader de caméra sélectionné possède des paramètres, ceux-ci s’affichent sous le panneau Lens.

Écriture de shaders de caméra

Inputs

L’entrée principale du shader de caméra est la position du capteur. Ceci est fourni par la fonction camera_shader_raster_position(), qui renvoie un point dont les composantes X et Y stockent la position dans l’image dans la plage de 0-1.

Afin de prendre en charge l’échantillonnage aléatoire dans le shader, une paire de nombres aléatoires est fournie par camera_shader_random_sample(), qui renvoie un vecteur contenant des nombres aléatoires dans ses composantes X et Y. Pour le cas particulier de l’échantillonnage de l’ouverture, il est préférable d’utiliser l’attribut cam:aperture_position (voir ci-dessous) pour être compatible avec les options d’ouverture habituelles de Blender.

Outputs

Le shader doit générer trois variables :
  • position, une variable de type point qui contient l’origine du rayon généré.

  • direction`, une variable de type vector qui contient la direction normalisée du rayon généré.

  • throughput, une variable de type color qui contient le débit du rayon - un facteur de pondération

qui peut être utilisé pour atténuer ou teinter la couleur résultante vue par la caméra.

La position et la direction (les deux) sont exprimées en coordonnées de la caméra, où l’origine est la position de la caméra elle-même, l’axe Z positif est la direction de la vue et l’axe Y positif est la direction vers le haut.

Si throughput est noir, le rayon résultant est ignoré. Cela peut être utilisé, par exemple, pour indiquer des rayons invalides pour les cartographies panoramiques.

Attributes

Étant donné que les shaders de caméra ne sont pas des shaders au sens traditionnel du terme, de nombreuses fonctionnalités d’OSL telles que les fermetures (closures) ou les attributs liés à la géométrie ne sont pas disponibles.

Au lieu de cela, les attributs suivants spécifiques à la caméra sont disponibles via getattribute() :

cam:sensor_size

Taille du capteur de la caméra en millimètres, comme défini dans les propriétés de la camera properties.

cam:image_resolution

Résolution de l’image rendue.

cam:focal_distance

Distance focale de la camera en millimètres, telle que définie dans les propriétés Profondeur de champ.

cam:aperture_aspect_ratio

Rapport d’aspect de l’ouverture de la caméra, tel que défini dans les propriétés Profondeur de champ.

cam:aperture_size

Taille de l’ouverture de la caméra, telle que définie dans les propriétés Profondeur de champ.

cam:aperture_position

Une position aléatoire sur l’ouverture, en tenant compte de sa taille, de sa forme et de ses rapports d’aspect tels que définis dans les propriétés Profondeur de champ. Notez que cela utilise les mêmes nombres aléatoires que ceux fournis par camera_shader_random_sample(), donc évitez d’utiliser les deux car cela entraînerait des problèmes de corrélation.

Dérivés

Pour certaines fonctionnalités telles que le nœud Wireframe, Cycles a besoin de dérivées de l’origine et de la direction du rayon par rapport aux coordonnées X et Y de l’image.

Par défaut, l’auto-différenciation OSL sera utilisée pour les calculer. Pour les cas avancés où vous pouvez calculer les dérivées plus précisément ou plus efficacement, vous pouvez faire en sorte que votre shader génère quatre variables supplémentaires nommées dPdx, dPdy, dDdx et dDdy. Si l’une d’entre elles est présente, ses valeurs seront utilisées à la place. Notez que vous ne pouvez pas mélanger les deux options - toutes ou aucune doivent être explicitement fournies.

Paramètres

Les shaders peuvent définir des paramètres d’entrée supplémentaires. Ceux-ci seront affichés à l’utilisateur dans le panneau des propriétés de la caméra, sous les options Lens.

Pour mieux contrôler la façon dont cela est présenté, les métadonnées OSL « « suivantes peuvent être utilisées :

[[ string help = "This is a parameter" ]]

Description du paramètre, affichée dans l’infobulle.

[[ float sensitivity = 0.25 ]]

Jusqu’où incrémenter/décrémenter le paramètre lors du glisser/cliquer.

[[ int digits = 2 ]]

Le nombre de chiffres affichés pour les paramètres numériques.

[[ float min = -5, float max = 5 ]]

Quelle portée peut prendre la propriété.

[[ int slider = 1, float slidermin = -4, float slidermax = 4 ]]

Affiche la propriété sous la forme d’un curseur avec la plage donnée.

[[ string widget = "boolean" ]]

Affiche la propriété “int” sous la forme d’une case à cocher, ce qui donne les valeurs 0 ou 1.

Un exemple

Il s’agit d’un shader très basique implémentant une caméra perspective :

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));
}

D’autres exemples peuvent être trouvés dans Text Editor ‣ Templates ‣ Open Shading Language.

Limitations

Important

Les caméras personnalisées ne sont pas prises en charge par le rendu GPU à moins d’utiliser le backend Optix.

Certaines fonctionnalités de Cycles, en particulier les coordonnées de passe vectorielle et de texture de fenêtre, nécessitent des correspondances inverses entre les rayons et les coordonnées de l’image. Ce n’est pas encore pris en charge par les caméras personnalisées.