Càmera expressa

A més dels tipus de càmera incorporada (càmeres de Perspectiva, Ortogràfica i Panoràmica), Cycles també admet la implementació de càmeres expresses que usin Llenguatge d’aspecció obert (OSL).

Les càmeres a mida s’implementen com a aspectors d’OSL. Un aspector de càmera rep una posició de sensor com a ingressió i egressa la posició, direcció i compleció del raig corresponent.

L’OSL per a aspecció i càmeres expresses són independents, cosa que vol dir que el darrer es pot fer servir encara que l’OSL d’aspecció estigui deshabilitat.

Ús de càmeres expresses

Per utilitzar una càmera expressa, cal posar el tipus de lent com A mida.

Això habilita la selecció d’un bloc de dades de text o document extern, semblantment al node Protocol per als aspectors.

Si l’aspector de càmera seleccionat té paràmetres, és mostraran a sota del plafó de Lent.

Escriptura d’aspectors de càmera

Entrades

La ingressió principal a l’aspector de càmera és la posició del sensor. La proporciona la funció camera_shader_raster_position(), que retorna un punt les components X i Y del qual emmagatzemen la posició dins de la imatge en l’interval de 0-1.

A efectes de facilitar-li a l’aspector el mostreig aleatori, camera_shader_random_sample() aporta un parell de números aleatoris, que retorna un vector que conté nombres aleatoris en els seus components X i Y. Per al cas específic de mostrejar l’obertura, és millor utilitzar l’atribut cam:aperture_position (vegeu més avall) perquè sigui compatible amb les opcions d’apertura habituals de Blender.

Sortides

L’aspector s’espera que egressi tres variables:
  • position, una variable de tipus point que conté l’origen del raig generat.

  • direction, la variable del tipus vector que conté una direcció normalitzada del raig generat.

  • throughput, la variable del tipus color que conté la compleció del raig - un factor de ponderació

que es pot utilitzar per afeblir o tenyir el color resultant que es veu per la càmera.

Tant la position com la direction estan en coordenades de càmera, on l’origen és la ubicació de la càmera, l’eix Z positiu és la direcció de la vista i l’eix Y positiu és cap amunt.

Si throughput és negre, el raig resultant s’omet. Es pot fer servir p. ex. per indicar raigs no vàlids en mapejats panoràmics.

Atributs

Com que els aspectors de càmera no són aspectors en el sentit tradicional, no disposen de gaires funcionalitats de l’OSL com les closes i els atributs lligats a geometria.

En lloc d’això, els atributs específics de càmera que segueixen també estan disponibles a través de getattribute():

cam:sensor_size

Mida del sensor de càmera en mil·límetres, tal com està definit en les Propietats de càmera.

cam:image_resolution

Resolució de la imatge revelada.

cam:focal_distance

Distància focal de la càmera en mil·límetres, tal com es defineix a les propietats de Profunditat de camp.

cam:aperture_aspect_ratio

Ràtio d’aspecte de l’obertura de càmera tal com figura a les propietats de Profunditat de camp.

cam:aperture_size

Mida de l’apertura, com figura a les propietats de Profunditat de camp.

cam:aperture_position

Una ubicació aleatòria en l’obertura, tenint en compte la mida, forma i relació d’aspecte tal com consta a les propietats de Profunditat de camp. Tingueu present que se serveix dels mateixos nombres aleatoris proporcionats pel camera_shader_random_sample(), així que eviteu d’utilitzar-los tots dos, que provocaria problemes de correlació.

Derivatius

Per a algunes funcionalitats, com la del node Tramat, Cycles necessita derivades de l’origen i la direcció del raig respecte de les coordenades X i Y de la imatge.

Per defecte, s’utilitzarà l’autodiferenciació d’OSL per calcular-los. Per a casos avançats on podeu calcular els derivatius amb més precisió o eficiència, podeu fer que el vostre aspector egressi quatre variables addicionals anomenades dPdx, dPdy, dDdx i dDdy. Si alguna d’aquestes és present, s’utilitzaran els seus valors. Tingueu en compte que no podeu combinar totes dues opcions: cal proporcionar totes les variables explícitament o cap .

Paràmetres

Els aspectors poden definir paràmetres d’ingressió addicionals que s’exposaran a la usuària al plafó de propietats de Càmera, a les opcions de la Lent.

Per controlar encara més com es presenten, es pot fer ús de les metadades següents d’OSL:

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

.Descripció del paràmetre, que surt a la pista de funcionament.

[[ float sensitivity = 0.25 ]]

Fins a quin punt incrementar/decrementar el paràmetre en arrossegar/clicar.

[[ int digits = 2 ]]

Quants dígits es mostren en els paràmetres numèrics.

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

Quin interval pot agafar la propietat.

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

Mostra la propietat com un lliscador de l’interval donat.

[[ string widget = "boolean" ]]

Mostra la propietat `int` com una casella que treu els valors 0 o 1.

Un exemple

Aquí tenim l’aspector més bàsic que implementa una càmera de perspectiva:

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

Hi ha més exemples a Editor de text ‣ Plantilles ‣ Llenguatge d’aspecció obert.

Limitacions

Important

Les càmeres expresses no són compatibles amb el revelat de GPU llevat que s’utilitzi el basament OptiX.

Algunes funcionalitats de Cycles, especialment les coordenades de passada Vectorial i les de textura de Finestra, requereixen mapejats inversos des dels raigs a les coordenades de la imatge. Això encara no és compatible amb les càmeres expresses.