Polynomial optics to Arnold. Camera shader with high-order aberrations
C++ C Python Makefile
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.


POTA is an implementation of Sparse high-degree polynomials for wide-angle lenses [2016] for the Arnold renderer. It renders images with high-order aberrations, at a fraction of the cost of tracing rays through lens elements. It is done by pre-calculating fitted polynomials, which serve as a black-box to transform the rays on the sensor to rays on the outer pupil. All credit goes out to the authors of the paper, I only wrote the implementation for Arnold.

Read the full documentation here.


Compile instructions:

Base requirement: Arnold >


open makefile     ### change arnold sdk path
mkdir bin


###   using the "x64 native tools command prompt for VS 2017"

cl /LD /I ...\Arnold-\include /EHsc /O2 pota.cpp /link /LIBPATH:...\Arnold-\lib ai.lib



  • Calculate accurate infinity focus before lens generation (lentil)
  • Compute focal length before lens generation so I can properly match the lenses (lentil)
  • Fix clipping, not sure why but pota's is closer than the perspective camera by a factor of 10


  • add energy-redistribution bidirectional sampling (aov shader)
  • fix nans of double gauss angenieux (energy redistribution)


  • bidirectional energy redistribution: check for intersections along P->Lens path
  • bidirectional energy redistribution: come up with better triggering of backtracing, based on sample intensity, distance from focal point, fstop, ..?
  • add support for x and y cylinders for newer anamorphic lenses (lentil)


  • remove arnold library dependency to make pota renderer agnostic