Anpassad kamera

Förutom de inbyggda kameratyperna (perspektiv-, ortografi- och panoramakameror) stöder Cycles även implementering av egna kameror med hjälp av Open Shading Language <https://github.com/AcademySoftwareFoundation/OpenShadingLanguage>`__ (OSL).

Anpassade kameror är implementerade som OSL-shaders. En kamera-shader tar emot en sensorposition som indata och matar ut motsvarande stråles position, riktning och genomströmning.

OSL för skuggning och anpassade kameror är oberoende, så den senare kan användas även när OSL-skuggning är inaktiverad.

Använda anpassade kameror

För att kunna använda en anpassad kamera måste du ställa in :ref:``lens type <camera-lens-type>` till Custom.

Detta möjliggör val av ett textdatablock eller en extern fil, på samma sätt som Script-noden i shaders.

Om den valda kameraskuggningen har parametrar visas de under Lens-panelen.

Skriva kameraskuggor

Inmatningar

Den primära indata till kamera-shadern är sensorns position. Detta tillhandahålls av funktionen camera_shader_raster_position(), som returnerar en punkt vars X- och Y-komponenter lagrar positionen i bilden i intervallet 0-1.

För att stödja slumpmässig provtagning i shadern tillhandahålls ett par slumptal av camera_shader_random_sample(), som returnerar en vektor som innehåller slumptal i sina X- och Y-komponenter. För det särskilda fallet med provtagning av bländaren är det bättre att använda attributet cam:aperture_position (se nedan) för att vara kompatibel med Blenders vanliga bländaralternativ.

Utgångar

Shadern förväntas mata ut tre variabler:
  • position, en variabel av typen point som innehåller den genererade strålens ursprung.

  • direction, en variabel av typen vektor som innehåller den normaliserade riktningen för den genererade strålen.

  • genomströmning, en variabel av typen färg som innehåller strålens genomströmning - en viktningsfaktor

som kan användas för att dämpa eller tona den resulterande färg som kameran ser.

Både position och riktning är i kamerakoordinater, där origo är kamerans position, den positiva Z-axeln är visningsriktningen och den positiva Y-axeln är uppåt.

Om throughput är svart, hoppas den resulterande strålen över. Detta kan t.ex. användas för att ange ogiltiga strålar för panoramamappningar.

Attribut

Eftersom kameraskuggor inte är skuggor i traditionell mening är många av OSL:s funktioner, t.ex. closures eller geometri-relaterade attribut, inte tillgängliga.

Istället är följande kameraspecifika attribut tillgängliga via getattribute():

cam:sensor_size

Kamerasensorns storlek i millimeter, enligt inställningen i Kameraegenskaper.

cam:image_resolution

Upplösning för den renderade bilden.

cam:focal_distance

Kamerans brännvidd i millimeter, enligt inställningen i egenskaperna Depth of Field.

cam:aperture_aspect_ratio

Bildförhållande för kamerans bländare, enligt inställningen i egenskaperna Depth of Field.

cam:aperture_size

Storlek på kamerans bländare, enligt inställningen i egenskaperna Depth of Field.

cam:aperture_position

En slumpmässig position på bländaren, med hänsyn till dess storlek, form och bildförhållande som anges i Depth of Field-egenskaperna. Observera att detta använder samma slumptal som tillhandahålls av camera_shader_random_sample(), så undvik att använda båda eftersom det skulle leda till korrelationsproblem.

Derivat

För vissa funktioner, t.ex. Wireframe-noden, behöver Cycles derivata av strålens ursprung och riktning i förhållande till bildens X- och Y-koordinater.

Som standard kommer OSL-autodifferentiering att användas för att beräkna dessa. För avancerade fall där du kan beräkna derivaten mer exakt eller effektivt kan du få din shader att mata ut fyra ytterligare variabler som heter dPdx, dPdy, dDdx och dDdy. Om någon av dessa finns kommer deras värden att användas istället. Observera att du inte kan blanda båda alternativen - antingen alla eller inga måste anges explicit.

Parametrar

Shaders kan definiera ytterligare inmatningsparametrar. Dessa kommer att visas för användaren i egenskapspanelen för kameran, under alternativen för objektiv.

För att ytterligare kontrollera hur de presenteras kan följande OSL-metadata användas:

[[ string help = "Detta är en parameter" ]]`

Beskrivning av parametern som visas i verktygstipset.

[[ float känslighet = 0,25 ]]`

Hur långt ska parametern ökas/minskas när du drar/klickar.

[[ int siffror = 2 ]]`

Hur många siffror som visas för numeriska parametrar.

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

Vilket intervall fastigheten kan ta på sig.

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

Visa egenskapen som ett skjutreglage med det angivna intervallet.

[[ string widget = "boolean" ]]`

Visa egenskapen `int` som en kryssruta, vilket resulterar i värdena 0 eller 1.

Ett exempel

Detta är en mycket grundläggande shader som implementerar en perspektivkamera:

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

Fler exempel finns i Text Editor ‣ Templates ‣ Open Shading Language.

Begränsningar

Viktigt

Anpassade kameror stöds inte med GPU-rendering om inte OptiX-backend används.

Vissa funktioner i Cycles, i synnerhet Vector pass och Window texture coordinates, kräver inversa mappningar från strålar till bildkoordinater. Detta stöds ännu inte med anpassade kameror.