30
$\begingroup$

Having recently seen the Siggraph paper A Practical Extension to Microfacet Theory for the Modeling of Varying Iridescence, I of course said to myself "I have to have this in Blenderrrrr!" and started to experiment with a node setup to at least simulate it.

The paper, while not too long, is quite technical and mathy, and over my head. But I did glean some basic information from it (please point out any mistakes):

Iridescence is the result of a phase shift during refraction.

Light wave refraction phase shift

The colors of iridescence can be represented by drawing a spiral curve through a color space.

A spiral curve through color space

The color banding changes with the incident angle. So, of course the good ol' Fresnel effect is at play here. Seems logical to assume we need to have physically accurate Fresnel if we want to have physically accurate iridescence.

Iridescence color changes with Fresnel

It seems all this complex math can be represented in approximation by a color ramp! Heyyyy, I use color ramps all the time. Maybe this won't be so hard after all.

I don't know what $\mathcal{D}_\text{inc}$ is though... (no dinc jokes in the comments, please). If you know what it means, please comment or answer.

A ColorRamp! This is starting to look familiar.

Could this approximation be perhaps close enough for our practical rendering purposes?

Let's take our screen shot of the gradient and crop it:

Cropped image of iridescent color gradient

Instead of painstakingly setting hundreds of gradient stops for the color bands we can plug in the cropped image of the gradient with the vector data from a Layer Weight node like this:

Cycles node setup for an image gradient

Now we have fake iridescent color!

Suzanne using the new and stylish iridescent gradient

From here I've been experimenting with PBR node setups and trying to plug this gradient color data in in some meaningful way. I've made some neat looking materials, but as far as physical accuracy goes, I can't say I've made much progress. Since my understanding of the paper is incomplete, I'm asking the community: Can we create an iridescence shader like the one described in this paper, in Cycles?

$\endgroup$
10
  • 1
    $\begingroup$ For Dinc check here: hal.archives-ouvertes.fr/hal-01518344/file/supp-mat-small.pdf Second paragraph. I'm totally dumb in maths (and physics with optics included) but Dinc (for me) looks like thin-film layer thickness. Don't take my word for it, I'm probably (mostly) wrong. $\endgroup$
    – cgslav
    Commented Jul 3, 2017 at 16:17
  • 1
    $\begingroup$ But there is it from @brecht: "Strictly speaking Cycles wouldn't need to be a spectral renderer to support dispersion, it can be fit in without that." $\endgroup$
    – cgslav
    Commented Jul 3, 2017 at 18:28
  • 2
    $\begingroup$ Please keep in mind that I was just playing here, but also tried to incorporate your efforts into the experiment. As far as the goal I was shooting for: I was referring to the chair material found in your provided link As requested, here is my experiments: $\endgroup$
    – Rick Riggs
    Commented Jul 11, 2017 at 5:09
  • 1
    $\begingroup$ @RickRiggs Thanks for sharing your experimentation. :-) $\endgroup$
    – Mentalist
    Commented Jul 11, 2017 at 14:35
  • 1
    $\begingroup$ blenderartists.org/forum/… $\endgroup$
    – JakeD
    Commented Apr 5, 2018 at 13:25

1 Answer 1

1
$\begingroup$

"You DO have this in Blenderrrrr!" since POV-Ray does support Newton's thin-film coating under the iridescence keyword: enter image description here

enter image description here

$\endgroup$
2
  • $\begingroup$ That's interesting, and good to know. However, please note that I did specify in my question title that I am looking to do this within the Cycles render engine. $\endgroup$
    – Mentalist
    Commented Jul 10, 2018 at 14:07
  • $\begingroup$ This video might be helpful too: youtube.com/watch?v=xjMjWtntm9k $\endgroup$
    – Ray
    Commented Jul 1, 2020 at 11:34

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .