diff --git a/pxr/usd/usdLux/iesAngleScale/UsdLux-IESAngleScale-FindingsAndQuestions.md b/pxr/usd/usdLux/iesAngleScale/UsdLux-IESAngleScale-FindingsAndQuestions.md new file mode 100644 index 00000000000..14bbdf727d0 --- /dev/null +++ b/pxr/usd/usdLux/iesAngleScale/UsdLux-IESAngleScale-FindingsAndQuestions.md @@ -0,0 +1,822 @@ +# ies:AngleScale - findings and questions + +While working to [explicitly specify +UsdLux](https://github.com/PixarAnimationStudios/OpenUSD/pull/3182), we needed +to determine the formula for applying the [ies:angleScale][ies_angleScale_doc]. + +The [version we settled on for our initial PR][pr_iesAngleScale_formula] was: + +$$ \theta_{ies} = \frac{\theta_{light} - \pi}{1 + angleScale} + \pi $$ + +This formula was chosen because it matches the behavior of how RenderMan applies +`ies:angleScale`, as the attribute is presumably derived from the [profile scale +attribute in Renderman.][rman_profile_scale_doc]. + +However, this choice has several drawbacks, so we thought we should share our +findings and solicit advice. + +## Visualization + +### Render 1 - Preview render + +The most intuitive way to get a sense for the data in an `.ies` file is to +provide a rendering of what a basic scene illuminated by that light might look +like. This is the approach used by [ieslibrary.com](ieslibrary.com) in it's +preview lights, so I decided to roughly replicate their setup: + +- scene has a floor and a wall (both perfectly diffuse) +- light is placed 1 meter above the floor, and 5 cm in front of the wall +- camera is 2.5 meters above the floor, and 4 meters in front of the wall +- camera is aimed back at the wall / light, angled down 30° from parallel + to the floor +- light is oriented so that: + - down is 0° vertical + - up is 180° vertical + - 0° horizontal is aimed toward the camera + - +90° horizontal is screen left (from camera's point of view) + - -90° / +270° horizontal is screen right (from camera's point of view) + +#### Render 1 Example: + +For an example of this render, I used a downward-aimed light picked +arbitrarily from [ieslibrary.com](ieslibrary.com): + + + + + + + + + +
+ +180° vertical, +180° horizontal + +
+90° horizontal + +

+ + [exr] + + + [png] + + + [ies] + +
+ + [usda] + (frame 1) +

-90° horizontal

(+270° horizontal) +

+ 0° vertical, 0° horizontal + +
+ + +### Render 2 - Interior of sphere + +While the above render gives a quick sense of what the light might look like in +the world, it's not good for displaying the distribution of the light across +the entire 0° (bottom) to 180° (top) range of vertical angles, as the scene +is set up to mostly highlight downward emissions. + +To view the entire vertical-angle distribution, I made a second scene rendering +the light casting on the interior of a sphere: + +- a light with the IES profile is at the center of a sphere +- a camera with a 90° field of view is also placed at the sphere center +- the interior of the sphere is rendered twice, aimed to display: + - horizontal angles -45° to 45°, vertical angles 90° to 180° (top) + - horizontal angles -45° to 45°, vertical angles 0° to 90° (bottom) +- the two renders are then stitched together to create a single image + +#### Render 2 Example: + +For an example of this render, I used the same downward-aimed light picked +arbitrarily from [ieslibrary.com](ieslibrary.com) used in the previous render: + + + + + + + + + +
+ +180° vertical + +
+45° horizontal + +

+ + [exr] + + + [png] + + + [ies] + +
+ + [usda] + (frame 1) +

-45° horizontal

(+315° horizontal) +

+ 0° vertical + +
+ + +### Striped IES Test file + +Finally, to visualize the effect of the angleScale, I created a [test .ies +file][ies_test_file] consisting of bands of alternating dark/light horizontal +stripes every 10 vertical degrees. The bottom (verticalAngle=0) is always .25 +(gray-black) and the top (verticalAngle=180) is always .75 (gray-white). (The +horizontal angle space is also divided into quadrants, but we can ignore +horizontal-angle differences for this discussion.) + +#### Striped IES File: Render 1 - Preview Render: + + + + + + + + + +
+ +180° vertical, +180° horizontal + +
+90° horizontal + +

+ + [exr] + + + [png] + + + [ies] + +
+ + [usda] + (frame 11) +

-90° horizontal

(+270° horizontal) +

+ 0° vertical, 0° horizontal + +
+ +#### Striped IES File: Render 2 - Interior of sphere: + + + + + + + + + +
+ +180° vertical + +
+45° horizontal + +

+ + [exr] + + + [png] + + + [ies] + +
+ + [usda] + (frame 11) +

-45° horizontal

(+315° horizontal) +

+ 0° vertical + +
+ + +## Existing formulas + +### RenderMan + +As noted above, RenderMan appears to use this formula: + +$$ \theta_{ies} = \frac{\theta_{light} - \pi}{1 + angleScale} + \pi $$ + +...which can be rewritten as: + +$$ (\theta_{ies} - \pi)\ (1 + angleScale) = (\theta_{light} - \pi) $$ + +...from which we can see that the relation is a simple scale by +$(1 + angleScale)$, offset so the scale origin is at $(\theta_{light},\ \theta_{ies}) = (\pi,\ \pi)$. + +![ies_angleScale_Renderman_clamped.jpg](ies_angleScale_Renderman_clamped.jpg) + +#### RenderMan: ies:angleScale from -1 to 1 + + +| -1.00 | -0.75 | -0.50 | -0.25 | =0.00 | +0.25 | +0.50 | +0.75 | +1.00 | +| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | +| ![RM-1.00_pre] | ![RM-0.75_pre] | ![RM-0.50_pre] | ![RM-0.25_pre] | ![RM=0.00_pre] | ![RM+0.25_pre] | ![RM+0.50_pre] | ![RM+0.75_pre] | ![RM+1.00_pre] | +| ![RM-1.00_tst] | ![RM-0.75_tst] | ![RM-0.50_tst] | ![RM-0.25_tst] | ![RM=0.00_tst] | ![RM+0.25_tst] | ![RM+0.50_tst] | ![RM+0.75_tst] | ![RM+1.00_tst] | +| ![RM-1.00_gph] | ![RM-0.75_gph] | ![RM-0.50_gph] | ![RM-0.25_gph] | ![RM=0.00_gph] | ![RM+0.25_gph] | ![RM+0.50_gph] | ![RM+0.75_gph] | ![RM+1.00_gph] | + + +----------------------- + +### Karma + +Karma appears to use this formula, which has different behavior for positive and +negative values of angleScale: + +$$ +\theta_{ies} = +\begin{dcases} + \frac{\theta_{light}}{1 - angleScale}, & \text{if} \quad 0 < angleScale < 1 \\ + \theta_{light} \ (1 + angleScale), & \text{if} \quad -1 < angleScale < 0 \\ + 0, & \text{otherwise} \\ +\end{dcases} +$$ + +These are similar to the RenderMan formula, except there is a switch in behavior +at $angleScale = 0$, and the scaling origin is left at +$(\theta_{light},\ \theta_{ies}) = (0,\ 0)$: + + +![ies_angleScale_Karma_clamped.jpg](ies_angleScale_Karma_clamped.jpg) + + +#### Karma: ies:angleScale from -1 to 1 + +| -1.00 | -0.75 | -0.50 | -0.25 | =0.00 | +0.25 | +0.50 | +0.75 | +1.00 | +| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | +| ![Ka-1.00_pre] | ![Ka-0.75_pre] | ![Ka-0.50_pre] | ![Ka-0.25_pre] | ![Ka=0.00_pre] | ![Ka+0.25_pre] | ![Ka+0.50_pre] | ![Ka+0.75_pre] | ![Ka+1.00_pre] | +| ![Ka-1.00_tst] | ![Ka-0.75_tst] | ![Ka-0.50_tst] | ![Ka-0.25_tst] | ![Ka=0.00_tst] | ![Ka+0.25_tst] | ![Ka+0.50_tst] | ![Ka+0.75_tst] | ![Ka+1.00_tst] | +| ![Ka-1.00_gph] | ![Ka-0.75_gph] | ![Ka-0.50_gph] | ![Ka-0.25_gph] | ![Ka=0.00_gph] | ![Ka+0.25_gph] | ![Ka+0.50_gph] | ![Ka+0.75_gph] | ![Ka+1.00_gph] | + +----------------------- + +## Analysis of Karma + Renderman formulas + +### Behavior for common use case - spotlights + +Both of these are create linear relationships between $\theta_{light}$ and +$\theta_{ies}$, with the exact scaling factor depending on $angleScale$. + +Further, they both have a fixed scale-origin, though the origin varies between the +two: +- Renderman scale origin: $\theta = \pi$ +- Karma scale origin: $\theta = 0$ + +In the common case of a "spotlight" (or any light with a maximum brightness +centered in a particular direction), the scaling origin direction matters +because, if the scaling origin direction aligns with the light's primary axis, +`ies:angleScale` will behave in a manner artists will likely find intuitive. + +That is, if we have a spotlight where + +$$ iesProfilePrimaryAxis = scaleOrigin $$ + +...then altering the `ies:angleScale` will make the the "cone" seem to broaden +or narrow, in a manner that will "feel" a bit like opening and closing barn +doors on a light. + +However, if the primary axis is NOT aligned to the scaleOrigin, then altering +the `ies:angleScale` will make the light behave in a way that is likely less +intuitive or useful for lighters. + +This means that each of these will work "best" for only a certain subset of +spotlights, and *neither* will work "intuitively" for all lights: + +- RenderMan formula: + - works best for spotlights aimed "up" + - ie, maximum brightness centered around $verticalAngle = 180°$ + ($\theta = \pi$) +- Karma formula: + - works best for spotlights aimed "down" + - ie, maximum brightness centered around $verticalAngle = 0°$ ($\theta = 0$) + +#### Animations - Examples of "Good" and "Bad" scaling + +What exactly does it mean that I say the formulas work "best" only for lights +aimed in a certain direction? After all, even if the scaling origin is not +aligned to the ies light primary direction, it is still possible to achieve +something that looks somewhat like scaling the light up and down. + +However, if origin + primary light direction are not aligned, though you can +get the boundaries the light to shrink and grow, the behavior of the profile +within it's boundaries is probably not what a lighter would expect. + +To help visualize what I mean, I've created animations showing behavior of +both RenderMan and Karma for spot lights aimed both down and up. They're +displaying versions of my "striped" ies test file, but limited to a 90° cone +aimed either down (ie, verticalAngle < 45°) or up (ie, verticalAngle > 135°). +The `ies:angleScale` attribute is then animated to scale the light between +.5 (45° cone angle) and 1.5 (135° cone angle) - due to the differences in the +angleScale formula, the exact value need to achieve this varies in each case. + + + + + + + + + + + + + + + + + + + + + + + + + +
Light DirectionRenderMan (Scale origin: Up)Karma (Scale origin: Down)
Up + +
+ [mp4] + + [ies] + + + [usda] + (frames 1-49) +
+ +
+ + [mp4] + + + [ies] + + + [usda] + (frames 50-98) +
+
    +
  • "Good" scaling - seems to grow + shrink +
  • angleScale: .5 scale = -.5; 1.5 scale = .5 +
  • Please disregard the "blurry" rendering - I'm trying to resolve + this issue with RenderMan +
  • +
+
+
    +
  • "Bad" scaling - bands are created + disappear, large dead area at center when scaling up +
  • angleScale: .5 scale = -0.142857; 1.5 scale = 0.166667 +
+
Down + +
+ + [mp4] + + + [ies] + + + [usda] + (frames 1-49) +
+ +
+ + [mp4] + + + [ies] + + + [usda] + (frames 50-98) +
+
    +
  • "Bad" scaling - bands are created + disappear, large dead area at center when scaling up +
  • angleScale: .5 scale = 0.166667; 1.5 scale =-0.166667 +
  • Please disregard the "blurry" rendering - I'm trying to resolve + this issue with RenderMan +
  • +
+
+
    +
  • "Good" scaling - seems to grow + shrink +
  • angleScale: .5 scale = .5; 1.5 scale =-0.333333 +
+
+ +#### Which is more common - spotlights aimed up or down? + +If [ieslibrary.com](ieslibrary.com) is indicative, lights aimed **down** are +much more common - an ad-hoc perusal indicates that if a light has a "primary +direction", down is the by far the most common. They are apparently common +enough that the site maker designed their preview images assuming the light is +aimed downward, as lights aimed in other directions are poorly framed: + +| Aimed down (vangle 0°) | Aimed Side (vangle 90°) | Aimed Up (vangle 180°) | +| ------------------------- | ------------------------- | ---------------------- | +| ![down_light][down_light] | ![side_light][side_light] | ![up_light][up_light] | + +This indicates that the **Karma**-formula will result in more intuitive +manipulation for a greater majority of lights. + +### RenderMan vs Karma + +Here's a chart directly comparing these two formulas, with the option I consider +"better": + +| Feature | RenderMan | Karma | Winner | +| ------------------------------------------------------------ | -------------- | --------- | --------- | +| Scaling origin (works "best" with spotlights aimed this way) | Up (180°) | Down (0°) | | +| • Allows "good" scaling for "most common" spotlights | No | ***Yes*** | Karma | +| • Allows "good" scaling for spotlight aimed up OR down | No | No | | +| Useable domain (angleScale) | $(-1, \infty)$ | $[-1, 1]$ | | +| • Useable domain - Symmetric? | No | ***Yes*** | Karma | +| Relation between angleScale and scaling control | | | RenderMan | +| Same formula for entire domain? | ***Yes*** | No | RenderMan | +| Allows backwards-compatible mapping for RenderMan and Karma? | No | No | | + + +### No clear winner + +Unfortunately, I don't think either option is a clear winner, mostly because: + +- *Neither* will provide "good" scaling for a spotlight aimed in any + direction +- *Neither* formula is "backward compatible" with the other - ie, there's no + mapping from "old" values to "new" values that will result in unaltered + behavior for existing scenes. + +## Alternatives + +Given that bot the RenderMan and Karma formulas have significant drawbacks, +here are some proposals for alternative formulas: + +### A. Bimodal - Scaling Origin at 0° for angleScale > 0, 180° for angleScale < 0 + +This would allow us to support behavior "similar" to either of the current Karma +or RenderMan formulas, without having to add any new attributes. + +**Mathematical Description:** + +$$ +\theta_{ies} = +\begin{dcases} + \frac{\theta_{light}}{angleScale}, + & \text{if} \quad angleScale > 0 \\ + \\ + \theta_{light} + & \text{if} \quad angleScale = 0 \\ + \\ + \frac{\theta_{light} - \pi}{-angleScale} + \pi, + & \text{if} \quad angleScale < 0 \\ +\end{dcases} +$$ + +![ies_angleScale_Bimodal_clamped.jpg](ies_angleScale_Bimodal_clamped.jpg) + +#### Bimodal: ies:angleScale from -2 to -2 + + +| -2.00 | -1.50 | -1.00 | -0.50 | =0.00 | +0.50 | +1.00 | +1.50 | +2.00 | +| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | +| ![Bi-2.00_pre] | ![Bi-1.50_pre] | ![Bi-1.00_pre] | ![Bi-0.50_pre] | ![Bi=0.00_pre] | ![Bi+0.50_pre] | ![Bi+1.00_pre] | ![Bi+1.50_pre] | ![Bi+2.00_pre] | +| ![Bi-2.00_tst] | ![Bi-1.50_tst] | ![Bi-1.00_tst] | ![Bi-0.50_tst] | ![Bi=0.00_tst] | ![Bi+0.50_tst] | ![Bi+1.00_tst] | ![Bi+1.50_tst] | ![Bi+2.00_tst] | +| ![Bi-2.00_gph] | ![Bi-1.50_gph] | ![Bi-1.00_gph] | ![Bi-0.50_gph] | ![Bi=0.00_gph] | ![Bi+0.50_gph] | ![Bi+1.00_gph] | ![Bi+1.50_gph] | ![Bi+2.00_gph] | + + + + + + + + + + + + + + + + + + + + +
Light DirectionBimodal
Up + +
+ + [mp4] + + + [ies] + + + [usda] + (frames 1-49) +
+
    +
  • "Good" scaling - seems to grow + shrink +
  • angleScale: .5 scale = -.5; 1.5 scale = -1.5 +
+
Down + +
+ + [mp4] + + + [ies] + + + [usda] + (frames 1-49) +
+
    +
  • "Good" scaling - seems to grow + shrink +
  • angleScale: .5 scale = .5; 1.5 scale = 1.5 +
+
+ + +**Pros:** +- Can give "good" scaling with lights aimed either up OR down + - Use positive values for lights aimed down (most common) + - Use negative values for lights aimed up +- Requires no additional attributes +- Provides a backwards-compatible mapping for either RenderMan or Karma: + + +$\quad\quad$ RenderMan: + +$$ + angleScale_{new} = - (1 + angleScale_{old_R}) +$$ + +$\quad\quad$ Karma: + +$$ + angleScale_{new} = \begin{dcases} + 1 - angleScale_{old_K} & \text{if} \quad 0 < angleScale_{old_K} < 1 \\ + \frac{1}{1 + angleScale_{old_K}} & \text{if} \quad -1 < angleScale_{old_K} < 0 \\ + \end{dcases} +$$ + + +**Cons:** +- Doesn't give "good" scaling with ALL lights (ie, lights aimed to the side) +- ...nor does it provide a clear path to supporting any aim direction in the + future +- Non-intuitive "switch" in behavior when the angleScale crosses 0 +- Requires user to figure out whether they should use negative or positive + values to get "good" scaling for their light + +### B. Add other attributes + +If we're open to adding new attributes, we could allow precise control over +the scaling origin, potentially allow scaling even from horizontally-aimed +lights, and (possibly) make the formula seem a little less "black box" / +obscure. + +Options might include: + +- Adding a `vAngleScaleType` attributes + - Be an eumerated attribute that would allow choosing from fixed number of + behaviors - ie, scaling origin at top (RenderMan style) or bottom (Karma + style) + - Or could have an "auto" setting that attempts to calculate a primary light + direction + - Could provide some future proofing, by adding new allowed values +- Adding a `vAngleScaleCenter` attribute + - Would allow scaling from bottom (by setting to 0°) or top (by setting to + 180°) + - By itself, could allow "distorted" scaling of sideways-aimed lights (ie, + by still only scaling the vertical angle, and leaving horizontal angle + unaltered) +- Adding a `hAngleScaleCenter` attribute + - If combined with a `vAngleScaleCenter`, would allow radial scaling for + any ies light + +While these would enable more control, they would also introduce various levels +of additional complexity, and require more modification to the schema... and +there may not be much demand for this level of control. + + + + + + + + +[option_B]: #add-vAngleScaleCenter-attribute +[option_C]: #add-vAngleScaleCenter-hAngleScaleCenter-and-anglescaledirection-attributes + + +[ies_angleScale_doc]: + https://openusd.org/release/api/class_usd_lux_shaping_a_p_i.html#a36b62167bddbf3125fc922d78d104d0c +[pr_iesAngleScale_formula]: + https://github.com/PixarAnimationStudios/OpenUSD/blob/2bd74e30ca5110187b02ad3e8efa1b1c23891cd0/pxr/usd/usdLux/schema.usda#L797-L808 +[rman_profile_scale_doc]: + https://rmanwiki-26.pixar.com/space/REN26/19661751/PxrSphereLight#Light-Profile:~:text=Profile%20Scale +[ies_test_file]: + https://github.com/pmolodo/luxtest/blob/0f9955768eca64557be5150b78134b560749e392/test_vstripes_hquadrants_nonuniform.ies +[iesTest_usda]: + https://github.com/pmolodo/luxtest/blob/0f9955768eca64557be5150b78134b560749e392/usd/iesTest.usda +[iesLibPreview_usda]: + https://github.com/pmolodo/luxtest/blob/0f9955768eca64557be5150b78134b560749e392/usd/iesLibPreview.usda +[luxtest_repo]: + https://github.com/pmolodo/luxtest/tree/0f9955768eca64557be5150b78134b560749e392 +[down_light_ies]: + https://ieslibrary.com/browse/download/ies/04f377f94ce81cd7b5101fffdf571454/bf62776e70fb1699c9163756404c6c7ac19a1d875f069d2e964f69722374be23?cHash=1d691542fcd0ce49d33daf0288d2092e +[down_light]: https://ieslibrary.com/ies/BEGA/04f377f94ce81cd7b5101fffdf571454.jpg +[side_light]: https://ieslibrary.com/ies/GE_LIGHTING_SOLUTIONS/000720b7043c3ae136132bbad11155ed.jpg +[up_light]: https://ieslibrary.com/ies/BEGA/0184e55f1f5ef8ee9e8b006d6a7bf558.jpg + + +[RM-1.00_tst]: iesTest-ris.0012.png + 'RIS Sphere Interior -1.00 angleScale' +[RM-0.75_tst]: iesTest-ris.0013.png + 'RIS Sphere Interior -0.75 angleScale' +[RM-0.50_tst]: iesTest-ris.0014.png + 'RIS Sphere Interior -0.50 angleScale' +[RM-0.25_tst]: iesTest-ris.0015.png + 'RIS Sphere Interior -0.25 angleScale' +[RM=0.00_tst]: iesTest-ris.0016.png + 'RIS Sphere Interior =0.00 angleScale' +[RM+0.25_tst]: iesTest-ris.0017.png + 'RIS Sphere Interior +0.25 angleScale' +[RM+0.50_tst]: iesTest-ris.0018.png + 'RIS Sphere Interior +0.50 angleScale' +[RM+0.75_tst]: iesTest-ris.0019.png + 'RIS Sphere Interior +0.75 angleScale' +[RM+1.00_tst]: iesTest-ris.0020.png + 'RIS Sphere Interior +1.00 angleScale' + +[Ka-1.00_tst]: iesTest-karma.0012.png + 'Karma Sphere Interior -1.00 angleScale' +[Ka-0.75_tst]: iesTest-karma.0013.png + 'Karma Sphere Interior -0.75 angleScale' +[Ka-0.50_tst]: iesTest-karma.0014.png + 'Karma Sphere Interior -0.50 angleScale' +[Ka-0.25_tst]: iesTest-karma.0015.png + 'Karma Sphere Interior -0.25 angleScale' +[Ka=0.00_tst]: iesTest-karma.0016.png + 'Karma Sphere Interior =0.00 angleScale' +[Ka+0.25_tst]: iesTest-karma.0017.png + 'Karma Sphere Interior +0.25 angleScale' +[Ka+0.50_tst]: iesTest-karma.0018.png + 'Karma Sphere Interior +0.50 angleScale' +[Ka+0.75_tst]: iesTest-karma.0019.png + 'Karma Sphere Interior +0.75 angleScale' +[Ka+1.00_tst]: iesTest-karma.0020.png + 'Karma Sphere Interior +1.00 angleScale' + +[Bi-2.00_tst]: iesTest-embree.0012.png + 'Bimodal Sphere Interior -2.00 angleScale' +[Bi-1.50_tst]: iesTest-embree.0013.png + 'Bimodal Sphere Interior -1.50 angleScale' +[Bi-1.00_tst]: iesTest-embree.0014.png + 'Bimodal Sphere Interior -1.00 angleScale' +[Bi-0.50_tst]: iesTest-embree.0015.png + 'Bimodal Sphere Interior -0.50 angleScale' +[Bi=0.00_tst]: iesTest-embree.0016.png + 'Bimodal Sphere Interior =0.00 angleScale' +[Bi+0.50_tst]: iesTest-embree.0017.png + 'Bimodal Sphere Interior +0.50 angleScale' +[Bi+1.00_tst]: iesTest-embree.0018.png + 'Bimodal Sphere Interior +1.00 angleScale' +[Bi+1.50_tst]: iesTest-embree.0019.png + 'Bimodal Sphere Interior +1.50 angleScale' +[Bi+2.00_tst]: iesTest-embree.0020.png + 'Bimodal Sphere Interior +2.00 angleScale' + + +[RM-1.00_pre]: iesLibPreview-ris.0012.png + 'RIS Preview-1.00 angleScale' +[RM-0.75_pre]: iesLibPreview-ris.0013.png + 'RIS Preview-0.75 angleScale' +[RM-0.50_pre]: iesLibPreview-ris.0014.png + 'RIS Preview-0.50 angleScale' +[RM-0.25_pre]: iesLibPreview-ris.0015.png + 'RIS Preview-0.25 angleScale' +[RM=0.00_pre]: iesLibPreview-ris.0016.png + 'RIS Preview=0.00 angleScale' +[RM+0.25_pre]: iesLibPreview-ris.0017.png + 'RIS Preview+0.25 angleScale' +[RM+0.50_pre]: iesLibPreview-ris.0018.png + 'RIS Preview+0.50 angleScale' +[RM+0.75_pre]: iesLibPreview-ris.0019.png + 'RIS Preview+0.75 angleScale' +[RM+1.00_pre]: iesLibPreview-ris.0020.png + 'RIS Preview+1.00 angleScale' + +[Ka-1.00_pre]: iesLibPreview-karma.0012.png + 'Karma Preview-1.00 angleScale' +[Ka-0.75_pre]: iesLibPreview-karma.0013.png + 'Karma Preview-0.75 angleScale' +[Ka-0.50_pre]: iesLibPreview-karma.0014.png + 'Karma Preview-0.50 angleScale' +[Ka-0.25_pre]: iesLibPreview-karma.0015.png + 'Karma Preview-0.25 angleScale' +[Ka=0.00_pre]: iesLibPreview-karma.0016.png + 'Karma Preview=0.00 angleScale' +[Ka+0.25_pre]: iesLibPreview-karma.0017.png + 'Karma Preview+0.25 angleScale' +[Ka+0.50_pre]: iesLibPreview-karma.0018.png + 'Karma Preview+0.50 angleScale' +[Ka+0.75_pre]: iesLibPreview-karma.0019.png + 'Karma Preview+0.75 angleScale' +[Ka+1.00_pre]: iesLibPreview-karma.0020.png + 'Karma Preview+1.00 angleScale' + +[Bi-2.00_pre]: iesLibPreview-embree.0012.png + 'Bimodal Preview-2.00 angleScale' +[Bi-1.50_pre]: iesLibPreview-embree.0013.png + 'Bimodal Preview-1.50 angleScale' +[Bi-1.00_pre]: iesLibPreview-embree.0014.png + 'Bimodal Preview-1.00 angleScale' +[Bi-0.50_pre]: iesLibPreview-embree.0015.png + 'Bimodal Preview-0.50 angleScale' +[Bi=0.00_pre]: iesLibPreview-embree.0016.png + 'Bimodal Preview=0.00 angleScale' +[Bi+0.50_pre]: iesLibPreview-embree.0017.png + 'Bimodal Preview+0.50 angleScale' +[Bi+1.00_pre]: iesLibPreview-embree.0018.png + 'Bimodal Preview+1.00 angleScale' +[Bi+1.50_pre]: iesLibPreview-embree.0019.png + 'Bimodal Preview+1.50 angleScale' +[Bi+2.00_pre]: iesLibPreview-embree.0020.png + 'Bimodal Preview+2.00 angleScale' + + + +[RM-1.00_gph]: ies_angleScale_Renderman_clamped_-1.00.jpg +[RM-0.75_gph]: ies_angleScale_Renderman_clamped_-0.75.jpg +[RM-0.50_gph]: ies_angleScale_Renderman_clamped_-0.50.jpg +[RM-0.25_gph]: ies_angleScale_Renderman_clamped_-0.25.jpg +[RM=0.00_gph]: ies_angleScale_Renderman_clamped_+0.00.jpg +[RM+0.25_gph]: ies_angleScale_Renderman_clamped_+0.25.jpg +[RM+0.50_gph]: ies_angleScale_Renderman_clamped_+0.50.jpg +[RM+0.75_gph]: ies_angleScale_Renderman_clamped_+0.75.jpg +[RM+1.00_gph]: ies_angleScale_Renderman_clamped_+1.00.jpg + +[Ka-1.00_gph]: ies_angleScale_Karma_clamped_-1.00.jpg +[Ka-0.75_gph]: ies_angleScale_Karma_clamped_-0.75.jpg +[Ka-0.50_gph]: ies_angleScale_Karma_clamped_-0.50.jpg +[Ka-0.25_gph]: ies_angleScale_Karma_clamped_-0.25.jpg +[Ka=0.00_gph]: ies_angleScale_Karma_clamped_+0.00.jpg +[Ka+0.25_gph]: ies_angleScale_Karma_clamped_+0.25.jpg +[Ka+0.50_gph]: ies_angleScale_Karma_clamped_+0.50.jpg +[Ka+0.75_gph]: ies_angleScale_Karma_clamped_+0.75.jpg +[Ka+1.00_gph]: ies_angleScale_Karma_clamped_+1.00.jpg + +[Bi-2.00_gph]: ies_angleScale_Bimodal_clamped_-2.00.jpg +[Bi-1.50_gph]: ies_angleScale_Bimodal_clamped_-1.50.jpg +[Bi-1.00_gph]: ies_angleScale_Bimodal_clamped_-1.00.jpg +[Bi-0.50_gph]: ies_angleScale_Bimodal_clamped_-0.50.jpg +[Bi=0.00_gph]: ies_angleScale_Bimodal_clamped_+0.00.jpg +[Bi+0.50_gph]: ies_angleScale_Bimodal_clamped_+0.50.jpg +[Bi+1.00_gph]: ies_angleScale_Bimodal_clamped_+1.00.jpg +[Bi+1.50_gph]: ies_angleScale_Bimodal_clamped_+1.50.jpg +[Bi+2.00_gph]: ies_angleScale_Bimodal_clamped_+2.00.jpg diff --git a/pxr/usd/usdLux/iesAngleScale/angleScale_formulas.py b/pxr/usd/usdLux/iesAngleScale/angleScale_formulas.py new file mode 100644 index 00000000000..ec2bd788748 --- /dev/null +++ b/pxr/usd/usdLux/iesAngleScale/angleScale_formulas.py @@ -0,0 +1,291 @@ +# execfile(r"C:\src\NVIDIA\usd-ci\USD\pxr\usd\usdLux\iesAngleScale\angleScale_formulas.py") +from attrs import frozen +import dataclasses +import inspect +import math +import os + +import matplotlib.pyplot as plt +import mpl_toolkits.mplot3d.axes3d +import numpy +from numpy import angle +import spb +import sympy + +from typing import Optional, Tuple + +# from sympy import * +from spb import plot, plot3d + +INTERACTIVE_VIEW = True + + +THIS_FILE = os.path.abspath(inspect.getsourcefile(lambda: None) or __file__) +THIS_DIR = os.path.dirname(THIS_FILE) + +IMAGE_SAVE_FOLDER = THIS_DIR +os.makedirs(IMAGE_SAVE_FOLDER, exist_ok=True) + + +def Clamp(x, min, max): + return sympy.Min(sympy.Max(x, min), max) + + +theta, angleScale = sympy.symbols("theta angleScale") + +# angle_units = "radians" +ANGLE_UNITS = "degrees" + +if ANGLE_UNITS == "radians": + THETA_MAX = sympy.pi +elif ANGLE_UNITS == "degrees": + THETA_MAX = 180 + +# in latex format +THETA_INPUT_LABEL = r"$\theta_{light}$" +THETA_OUTPUT_LABEL = r"$\theta_{ies}$" +THETA_INPUT_LABEL = f"{THETA_INPUT_LABEL} ({ANGLE_UNITS})" +THETA_OUTPUT_LABEL = f"{THETA_OUTPUT_LABEL} ({ANGLE_UNITS})" + +THETA_MIN_MAX = (0, THETA_MAX) +ANGLESCALE_MIN_MAX = (-1, 1) + +@dataclasses.dataclass(frozen=True) +class ViewAngles: + elev: Optional[float] = None + azim: Optional[float] = None + roll: Optional[float] = None + + def is_null(self): + return self.elev is None and self.azim is None and self.roll is None + + def set_on_axes(self, axes): + if self.is_null(): + return + if not hasattr(axes, "view_init"): + return + axes.view_init(elev=self.elev, azim=self.azim, roll=self.roll) + +BIMODAL_VIEW_ANGLE = ViewAngles(azim=25.97402597402598, elev=42.792207792207805) +DEFAULT_VIEW_ANGLE = ViewAngles() + + +@dataclasses.dataclass(frozen=True) +class GraphOptions: + theta_min_max: Tuple[float, float] = THETA_MIN_MAX + angleScale_min_max: Tuple[float, float] = ANGLESCALE_MIN_MAX + box_aspect: Tuple[float, float, float] = (1, 1, 1) + view_angles: ViewAngles = DEFAULT_VIEW_ANGLE + + def set_on_graph(self, graph): + axes = graph.ax + if not "theta" in axes.get_xlabel(): + raise ValueError("expected x-axis to be theta") + + axes.set_xlabel(THETA_INPUT_LABEL) + axes.set_xlim(*self.theta_min_max) + if hasattr(axes, "set_zlim"): + axes.set_ylim(*self.angleScale_min_max) + axes.set_zlim(*self.theta_min_max) + axes.set_zlabel(THETA_OUTPUT_LABEL) + if self.box_aspect != (1, 1, 1): + print(f"{self.box_aspect=}") + axes.set_box_aspect(self.box_aspect) + else: + axes.set_ylim(*self.theta_min_max) + axes.set_ylabel(THETA_OUTPUT_LABEL) + aspect = (self.box_aspect[0], self.box_aspect[2]) + if aspect != (1, 1): + aspectRatio = aspect[1] / aspect[0] + axes.set_aspect(aspectRatio) + + self.view_angles.set_on_axes(axes) + + def theta_lim(self): + return (theta,) + self.theta_min_max + + def angleScale_lim(self): + return (angleScale,) + self.angleScale_min_max + + def make_graph2d(self, function, title): + graph = spb.plot(function, self.theta_lim(), show=False, title=title) + self.set_on_graph(graph) + return graph + + def make_graph3d(self, function, title): + graph = spb.plot3d(function, self.theta_lim(), self.angleScale_lim(), show=False, title=title) + self.set_on_graph(graph) + return graph + + +DEFAULT_GRAPH = GraphOptions() + +def save_graph(graph, filename, dpi=300): + ext = os.path.splitext(filename)[-1].lstrip(".") + if not ext or ext.isdigit(): + filename = filename + ".jpg" + print(f"Saving: {filename}") + filepath = os.path.join(IMAGE_SAVE_FOLDER, filename) + # this also ensures the graph is evaluated... I tried using + # "graph.process_series()", but that seemed to make a second copy of the + # graph, that didn't respect the zlim + axes = graph.ax + graph.fig.savefig(filepath, dpi=dpi) + + +def save_graph_slices(function, title, filename, num_slices, graph_options=DEFAULT_GRAPH): + start, end = graph_options.angleScale_min_max + dist = end - start + step = dist / (num_slices - 1) + for i in range(num_slices): + angleScale_val = round((i * step) + start, 6) + angleScale_str = f"{angleScale_val:+.02f}" + title_i = f"{title} (angleScale = {angleScale_str})" + filename_i = f"{filename}_{angleScale_str}" + slice_func = function.subs(angleScale, angleScale_val) + graph = graph_options.make_graph2d(slice_func, title=title_i) + if any( + isinstance(x, sympy.core.numbers.ComplexInfinity) + for x in slice_func.atoms() + ): + del graph.series[0] + graph_options.set_on_graph(graph) + axes = graph.ax + x_center = sum(axes.get_xlim()) / 2 + y_center = sum(axes.get_ylim()) / 2 + axes.text( + x_center, + y_center, + "Undefined\nAsymptote", + verticalalignment="center", + horizontalalignment="center", + fontsize=50, + ) + else: + graph.ax.get_lines()[0].set_linewidth(5) + save_graph(graph, filename_i) + plt.close(graph.fig) + + +def plot3d_and_save(function, title, slices=0, graph_options=DEFAULT_GRAPH): + graph = graph_options.make_graph3d(function, title=title) + filename = f"ies_angleScale_{title}" + filename = filename.replace(" - ", "-") + filename = filename.replace("/", "over") + for to_erase in "()": + filename = filename.replace(to_erase, "") + filename = filename.replace(" ", "_") + + save_graph(graph, filename) + if slices: + save_graph_slices(function, title, filename, num_slices=slices, graph_options=graph_options) + return graph + + +karma_pos = theta / (1 - angleScale) +karma_neg = theta * (1 + angleScale) + +karma = sympy.Piecewise( + (0, angleScale < -1), + (karma_neg, angleScale < 0), + (karma_pos, angleScale < 1), + (0, True), +) +karma_clamp = Clamp(karma, 0, THETA_MAX) + +karma_pos_clamp = Clamp( + sympy.Piecewise((0, angleScale < -1), (karma_pos, angleScale < 1), (0, True)), + 0, + THETA_MAX, +) + + +# karma_pos_graph = plot3d_and_save(karma_pos, "Karma (positive)") +# karma_neg_graph = plot3d_and_save(karma_neg, "Karma (negative)") + +# karma_graph = plot3d_and_save(karma, "Karma (unclamped)") + +karma_clamp_graph = plot3d_and_save(karma_clamp, "Karma (clamped)", slices=9) + +# karma_pos_clamp_graph = plot3d_and_save( +# karma_pos_clamp, "Karma - theta / (1-angleScale) only (clamped)" +# ) + +profile_scale = 1 + angleScale +rman = ((theta - THETA_MAX) / profile_scale) + THETA_MAX +rman_clamp = Clamp(sympy.Piecewise((rman, angleScale > -1), (0, True)), 0, THETA_MAX) + +# rman_graph = plot3d_and_save(rman, "Renderman (unclamped)") + +rman_clamp_graph = plot3d_and_save(rman_clamp, "Renderman (clamped)", slices=9) + + +# if angleScale > 0, scale origin is at bottom (vangle=0) +# if angleScale == 0, no change +# if angleScale < 0, scale origin is at top (vangle=180) + +bimodal_pos = theta / angleScale +bimodal_neg = ((theta - THETA_MAX) / -angleScale) + THETA_MAX +bimodal_neg_clamp = Clamp(bimodal_neg, 0, THETA_MAX) +# bimodal_neg_clamp_graph = plot3d_and_save(bimodal_neg_clamp, "Bimodal Neg (Clamped)", slices=9, angleScale_min_max=(-1, 0)) + +bimodal = sympy.Piecewise((bimodal_pos, angleScale > 0), (bimodal_neg, angleScale < 0), (theta, True)) +bimodal_clamp = Clamp(bimodal, 0, THETA_MAX) + + +bimodal_options = GraphOptions( + angleScale_min_max=(-2, 2), + box_aspect=(4, 8, 3), + view_angles=BIMODAL_VIEW_ANGLE) + +bimodal_clamp_graph = plot3d_and_save( + bimodal_clamp, + "Bimodal (clamped)", + slices=17, + graph_options=bimodal_options, +) + +if INTERACTIVE_VIEW: + plt.show() +else: + # plt.close("all") + pass + +# from sympy.solvers import solve + +# rtheta, ktheta = sympy.symbols("rtheta ktheta") +# req = rtheta - rman +# keq = ktheta - karma + + +# # renderman - light aimed down - 22.5 vangle (real world) maps to 45 (ies lookup) +# solve(req.subs({rtheta: 45, theta: 22.5}), angleScale) +# # 1/6 = 0.16666666666666666 + +# # renderman - light aimed down - 67.5 vangle (real world) maps to 45 (ies lookup) +# solve(req.subs({rtheta: 45, theta: 67.5}), angleScale) +# # -1/6 = -0.16666666666666666 + +# # karma - light aimed down - 22.5 vangle (real world) maps to 45 (ies lookup) +# solve(keq.subs({ktheta: 45, theta: 22.5}), angleScale) +# # 1/2 = .5 + +# # karma - light aimed down - 67.5 vangle (real world) maps to 45 (ies lookup) +# solve(keq.subs({ktheta: 45, theta: 67.5}), angleScale) +# # -1/3 = -0.3333333333333333 + +# # renderman - light aimed up - 112.5 vangle (real world) maps to 135 (ies lookup) +# solve(req.subs({rtheta: 135, theta: 112.5}), angleScale) +# # 1/2 = .5 + +# # renderman - light aimed up - 157.5 vangle (real world) maps to 135 (ies lookup) +# solve(req.subs({rtheta: 135, theta: 157.5}), angleScale) +# # -1/2 = -.5 + +# # karma - light aimed up - 112.5 vangle (real world) maps to 135 (ies lookup) +# solve(keq.subs({ktheta: 135, theta: 112.5}), angleScale) +# # 1/6 = 0.16666666666666666 + +# # karma - light aimed up - 157.5 vangle (real world) maps to 135 (ies lookup) +# solve(keq.subs({ktheta: 135, theta: 157.5}), angleScale) +# # -1/7 = -0.14285714285714285 diff --git a/pxr/usd/usdLux/iesAngleScale/iesDown-embree.mp4 b/pxr/usd/usdLux/iesAngleScale/iesDown-embree.mp4 new file mode 100644 index 00000000000..1b975f07f58 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesDown-embree.mp4 differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesDown-karma.mp4 b/pxr/usd/usdLux/iesAngleScale/iesDown-karma.mp4 new file mode 100644 index 00000000000..1d45ab9a50d Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesDown-karma.mp4 differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesDown-ris.mp4 b/pxr/usd/usdLux/iesAngleScale/iesDown-ris.mp4 new file mode 100644 index 00000000000..58e45418f25 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesDown-ris.mp4 differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0012.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0012.png new file mode 100644 index 00000000000..817a07c7c81 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0012.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0013.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0013.png new file mode 100644 index 00000000000..cae0155f4b3 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0013.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0014.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0014.png new file mode 100644 index 00000000000..1c11594be61 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0014.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0015.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0015.png new file mode 100644 index 00000000000..0e3e123936e Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0015.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0016.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0016.png new file mode 100644 index 00000000000..cb18e9dc525 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0016.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0017.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0017.png new file mode 100644 index 00000000000..6f531ce7d03 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0017.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0018.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0018.png new file mode 100644 index 00000000000..9f36b3a5775 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0018.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0019.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0019.png new file mode 100644 index 00000000000..a4847e7bb86 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0019.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0020.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0020.png new file mode 100644 index 00000000000..583df08baa4 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-arnold.0020.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0012.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0012.png new file mode 100644 index 00000000000..52375fa5003 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0012.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0013.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0013.png new file mode 100644 index 00000000000..6304b9071af Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0013.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0014.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0014.png new file mode 100644 index 00000000000..5af66b4c3df Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0014.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0015.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0015.png new file mode 100644 index 00000000000..ec48d42b6d1 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0015.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0016.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0016.png new file mode 100644 index 00000000000..864bc2d2068 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0016.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0017.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0017.png new file mode 100644 index 00000000000..5acdc5f57d9 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0017.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0018.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0018.png new file mode 100644 index 00000000000..8506481b877 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0018.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0019.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0019.png new file mode 100644 index 00000000000..f5e0000e927 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0019.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0020.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0020.png new file mode 100644 index 00000000000..71e30b694ac Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-embree.0020.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0001.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0001.png new file mode 100644 index 00000000000..b365886b30f Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0001.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0011.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0011.png new file mode 100644 index 00000000000..bd1f9c20559 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0011.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0012.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0012.png new file mode 100644 index 00000000000..c19e984837b Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0012.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0013.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0013.png new file mode 100644 index 00000000000..3ac16028805 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0013.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0014.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0014.png new file mode 100644 index 00000000000..aa5dccea19a Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0014.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0015.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0015.png new file mode 100644 index 00000000000..3e0462b5f74 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0015.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0016.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0016.png new file mode 100644 index 00000000000..9b1a73c3330 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0016.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0017.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0017.png new file mode 100644 index 00000000000..3c972c047a6 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0017.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0018.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0018.png new file mode 100644 index 00000000000..3f88eff4089 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0018.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0019.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0019.png new file mode 100644 index 00000000000..598be632ef8 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0019.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0020.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0020.png new file mode 100644 index 00000000000..e4bd0ea2191 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-karma.0020.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0012.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0012.png new file mode 100644 index 00000000000..ecd6121fcb3 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0012.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0013.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0013.png new file mode 100644 index 00000000000..80c12f473f4 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0013.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0014.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0014.png new file mode 100644 index 00000000000..5a9403d13f1 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0014.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0015.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0015.png new file mode 100644 index 00000000000..3ff977ef276 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0015.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0016.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0016.png new file mode 100644 index 00000000000..2d9131c3a91 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0016.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0017.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0017.png new file mode 100644 index 00000000000..68c922647aa Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0017.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0018.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0018.png new file mode 100644 index 00000000000..2cfa8945298 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0018.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0019.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0019.png new file mode 100644 index 00000000000..e4f04b5c367 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0019.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0020.png b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0020.png new file mode 100644 index 00000000000..4caee848562 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesLibPreview-ris.0020.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0012.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0012.png new file mode 100644 index 00000000000..2133f4d04e9 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0012.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0013.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0013.png new file mode 100644 index 00000000000..cfacb33d1b5 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0013.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0014.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0014.png new file mode 100644 index 00000000000..1e895583caf Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0014.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0015.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0015.png new file mode 100644 index 00000000000..5a36fdea79a Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0015.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0016.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0016.png new file mode 100644 index 00000000000..d93dabf88fe Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0016.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0017.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0017.png new file mode 100644 index 00000000000..9e26d41b250 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0017.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0018.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0018.png new file mode 100644 index 00000000000..f251eadf6da Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0018.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0019.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0019.png new file mode 100644 index 00000000000..a0273c73294 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0019.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0020.png b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0020.png new file mode 100644 index 00000000000..9a6d6e2fcd1 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-arnold.0020.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0012.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0012.png new file mode 100644 index 00000000000..fbcdbf4855c Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0012.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0013.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0013.png new file mode 100644 index 00000000000..e738733cbe9 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0013.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0014.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0014.png new file mode 100644 index 00000000000..c95305fc3e8 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0014.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0015.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0015.png new file mode 100644 index 00000000000..ba454f725f5 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0015.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0016.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0016.png new file mode 100644 index 00000000000..c44ab237b60 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0016.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0017.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0017.png new file mode 100644 index 00000000000..93cfea116e2 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0017.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0018.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0018.png new file mode 100644 index 00000000000..8fc667cdbe2 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0018.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0019.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0019.png new file mode 100644 index 00000000000..26d30cfc1d0 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0019.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0020.png b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0020.png new file mode 100644 index 00000000000..7253d4a75dc Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-embree.0020.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0001.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0001.png new file mode 100644 index 00000000000..89c2ff65e41 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0001.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0011.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0011.png new file mode 100644 index 00000000000..e36b4fe9a17 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0011.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0012.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0012.png new file mode 100644 index 00000000000..a2ec7c0ed9c Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0012.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0013.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0013.png new file mode 100644 index 00000000000..9be7f4d34bf Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0013.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0014.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0014.png new file mode 100644 index 00000000000..5a80a62d4a6 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0014.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0015.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0015.png new file mode 100644 index 00000000000..552fa6b4531 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0015.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0016.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0016.png new file mode 100644 index 00000000000..f3676e930fa Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0016.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0017.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0017.png new file mode 100644 index 00000000000..55dd47c1ab4 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0017.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0018.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0018.png new file mode 100644 index 00000000000..41ae1c9ee41 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0018.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0019.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0019.png new file mode 100644 index 00000000000..2ffa338324c Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0019.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0020.png b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0020.png new file mode 100644 index 00000000000..6d1255feabc Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-karma.0020.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0012.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0012.png new file mode 100644 index 00000000000..6fd0dcf7aea Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0012.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0013.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0013.png new file mode 100644 index 00000000000..49f8a0e3c59 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0013.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0014.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0014.png new file mode 100644 index 00000000000..b9657fa5b88 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0014.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0015.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0015.png new file mode 100644 index 00000000000..b160b8f7d57 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0015.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0016.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0016.png new file mode 100644 index 00000000000..0f76289f2c1 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0016.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0017.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0017.png new file mode 100644 index 00000000000..a37a069c314 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0017.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0018.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0018.png new file mode 100644 index 00000000000..de96e3f1d0d Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0018.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0019.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0019.png new file mode 100644 index 00000000000..3275070270b Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0019.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0020.png b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0020.png new file mode 100644 index 00000000000..13d066dcd48 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesTest-ris.0020.png differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesUp-embree.mp4 b/pxr/usd/usdLux/iesAngleScale/iesUp-embree.mp4 new file mode 100644 index 00000000000..96c3721ab3b Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesUp-embree.mp4 differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesUp-karma.mp4 b/pxr/usd/usdLux/iesAngleScale/iesUp-karma.mp4 new file mode 100644 index 00000000000..decd2dfcd9c Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesUp-karma.mp4 differ diff --git a/pxr/usd/usdLux/iesAngleScale/iesUp-ris.mp4 b/pxr/usd/usdLux/iesAngleScale/iesUp-ris.mp4 new file mode 100644 index 00000000000..1d15f2d327e Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/iesUp-ris.mp4 differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped.jpg new file mode 100644 index 00000000000..ee290b04e00 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.00.jpg new file mode 100644 index 00000000000..6479b16f8ba Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.25.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.25.jpg new file mode 100644 index 00000000000..6a1f116fb3c Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.25.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.50.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.50.jpg new file mode 100644 index 00000000000..ab5a01bcfdd Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.50.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.75.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.75.jpg new file mode 100644 index 00000000000..19a85ea4f07 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+0.75.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.00.jpg new file mode 100644 index 00000000000..f2ac5e58217 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.25.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.25.jpg new file mode 100644 index 00000000000..97cf890c8a0 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.25.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.50.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.50.jpg new file mode 100644 index 00000000000..22f73833c6f Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.50.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.75.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.75.jpg new file mode 100644 index 00000000000..fa3864b83e1 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+1.75.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+2.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+2.00.jpg new file mode 100644 index 00000000000..af3a9635597 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_+2.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.25.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.25.jpg new file mode 100644 index 00000000000..ec7f696d5f7 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.25.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.50.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.50.jpg new file mode 100644 index 00000000000..80e0f0dc916 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.50.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.75.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.75.jpg new file mode 100644 index 00000000000..e9ca8d4e4b5 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-0.75.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.00.jpg new file mode 100644 index 00000000000..867f74a462f Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.25.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.25.jpg new file mode 100644 index 00000000000..bb18d864e2e Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.25.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.50.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.50.jpg new file mode 100644 index 00000000000..52fbc752e37 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.50.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.75.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.75.jpg new file mode 100644 index 00000000000..d0e8d958872 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-1.75.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-2.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-2.00.jpg new file mode 100644 index 00000000000..b1f523cc724 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Bimodal_clamped_-2.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma-theta_over_1-angleScale_only_clamped.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma-theta_over_1-angleScale_only_clamped.jpg new file mode 100644 index 00000000000..ae595538d90 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma-theta_over_1-angleScale_only_clamped.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped.jpg new file mode 100644 index 00000000000..f73d799f72f Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.00.jpg new file mode 100644 index 00000000000..b33068be860 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.25.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.25.jpg new file mode 100644 index 00000000000..f48d8eb1c3e Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.25.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.50.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.50.jpg new file mode 100644 index 00000000000..6255a3d3ec6 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.50.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.75.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.75.jpg new file mode 100644 index 00000000000..5851a5df863 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+0.75.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+1.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+1.00.jpg new file mode 100644 index 00000000000..b54a2a946c0 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_+1.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.25.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.25.jpg new file mode 100644 index 00000000000..e3e67535cb0 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.25.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.50.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.50.jpg new file mode 100644 index 00000000000..944dcba6ba0 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.50.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.75.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.75.jpg new file mode 100644 index 00000000000..2cbc40e4041 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-0.75.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-1.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-1.00.jpg new file mode 100644 index 00000000000..2580de6c6e4 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_clamped_-1.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_unclamped.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_unclamped.jpg new file mode 100644 index 00000000000..9b06efd3ec7 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Karma_unclamped.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped.jpg new file mode 100644 index 00000000000..2fc7556c62a Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.00.jpg new file mode 100644 index 00000000000..26a3e4c258d Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.25.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.25.jpg new file mode 100644 index 00000000000..044d3182b26 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.25.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.50.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.50.jpg new file mode 100644 index 00000000000..c88c93f6307 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.50.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.75.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.75.jpg new file mode 100644 index 00000000000..ec4572f4653 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+0.75.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+1.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+1.00.jpg new file mode 100644 index 00000000000..7a131ad01f9 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_+1.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.25.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.25.jpg new file mode 100644 index 00000000000..3daeaceda46 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.25.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.50.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.50.jpg new file mode 100644 index 00000000000..95febe27bca Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.50.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.75.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.75.jpg new file mode 100644 index 00000000000..e0c7612bb94 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-0.75.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-1.00.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-1.00.jpg new file mode 100644 index 00000000000..33bba7bd961 Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_clamped_-1.00.jpg differ diff --git a/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_unclamped.jpg b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_unclamped.jpg new file mode 100644 index 00000000000..ac074364baf Binary files /dev/null and b/pxr/usd/usdLux/iesAngleScale/ies_angleScale_Renderman_unclamped.jpg differ