<p>I believe it is just another way to preserve the Fresnel effect for both light incident ray and view incident ray, since the whole diffuse substrate radiance should go through:</p>
<ol>
<li>The light chooses to refract into the coat and hits the substrate.</li>
<li>Reflected by the diffuse substrate.</li>
<li>The light chooses to refract out from the coat (which should be equivalent to view vector refracting into the coat).</li>
</ol>
<blockquote>
<p><a href="https://i.sstatic.net/65PoozxB.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/65PoozxB.png" alt="mitsuba3 BSDF document" /></a> (from <a href="https://mitsuba.readthedocs.io/en/stable/src/generated/plugins_bsdfs.html#bsdf-roughplastic" rel="nofollow noreferrer">Mitsuba3 docs BSDF plastic</a>)</p>
</blockquote>
<p>Therefore, both 1. and 3. should have Fresnel term. However, in Mitsuba3, similar (is it?) materials like plastic tend to this term different from what you have listed in your post:</p>
<pre class="lang-cpp prettyprint-override"><code>// from mistuba3 mitsuba3/src/bsdfs/plastic.cpp, `sample` function
value *= m_inv_eta_2 * (1.f - f_i) * (1.f - f_o) / prob_diffuse;
</code></pre>
<p>This should be the physically based way to incorporate both Fresnel terms, but my experiment suggests that it will make the diffuse substrate appear darker, see the following figures. So my answer (my guess), would be:</p>
<ul>
<li>Use <code>max</code> to preserve both Fresnel terms, so that the appearance is generally correct.</li>
<li><code>max</code> instead of the product makes the substrate looks brighter.</li>
</ul>
<p>The following figures have subtle differences between each other, so it is suggested that you download them and check the differences by quick swapping. The Vader helmet in the following scene employs the plastic material.</p>
<div class="s-table-container"><table class="s-table">
<thead>
<tr>
<th style="text-align: center;"><code>max</code> Fresnel</th>
<th style="text-align: center;">product F</th>
<th style="text-align: center;">F(N,L) only</th>
<th style="text-align: center;">F(N,V) only</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><a href="https://i.sstatic.net/pByktNfg.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/pByktNfg.png" alt="vader-fresnel-max" /></a></td>
<td style="text-align: center;"><a href="https://i.sstatic.net/Jpzq9no2.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/Jpzq9no2.png" alt="vader-fresnel-product" /></a></td>
<td style="text-align: center;"><a href="https://i.sstatic.net/jt43QW4F.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/jt43QW4F.png" alt="vader-fresnel-nl" /></a></td>
<td style="text-align: center;"><a href="https://i.sstatic.net/blRPmFUr.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/blRPmFUr.png" alt="vader-fresnel-nv" /></a></td>
</tr>
</tbody>
</table></div>

CC BY-SA 4.0
2024-11-07T14:36:20.857Z
Additional question: what's `m_inv_eta_2` for in mitsuba's implementation? @Enigmatisms
Tom Clabault
CC BY-SA 4.0
2024-11-08T03:09:26.890Z
I think it has something to do with non-symmetric scattering. See [PBR-book v3 16.1 Non-symmetry Due to Refraction](https://pbr-book.org/3ed-2018/Light_Transport_III_Bidirectional_Methods/The_Path-Space_Measurement_Equation) and Eric Veach Thesis Chapter 5 (5.2  Non-symmetry due to refraction).
Enigmatisms
CC BY-SA 4.0
2024-10-27T03:52:45.907Z
2024-10-27T03:52:45.907Z
Enigmatisms
<p>Dassault Systèmes has a spec for their PBR material: <a href="https://dassaultsystemes-technology.github.io/EnterprisePBRShadingModel/spec-2025x.md.html" rel="nofollow noreferrer">Enterprise PBR 2025</a></p>
<p>I rewrite Eq. 72 for clarity:</p>
<p><code>CoatedBRDF(…) = GlitteryCoreBRDF(…) * (1.0f − clearcoatWeight * CoatReflectedLight) + ClearcoatBRDF() * clearcoatWeight * Fresnel(H, V)</code></p>
<p>I understand that the reason we multiply the GlitteryCoreBRDF by <code>(1.0f - clearcoatWeight * CoatReflectedlight)</code> is because only the transmitted part of the light goes through the coat layer to the glittery core so the GlitteryCore only gets <code>1.0f - CoatReflectedLight</code> of the total incoming light.</p>
<p>The question is: why is <code>CoatReflectedLight</code> using <code>max(Fresnel(V, N), Fresnel(L, N)))</code> instead of just <code>Fresnel(N, L)</code>?</p>

<brdf><pbr><specular><fresnel>
Why is "Entreprise PBR 2025" from Dassault using 1.0f - max(Fr(V, N), Fr(L, N)) for the Fresnel transmission instead of just 1.0f - Fr(L, N)?
Tom Clabault
# Why is "Entreprise PBR 2025" from Dassault using 1.0f - max(Fr(V, N), Fr(L, N)) for the Fresnel transmission instead of just 1.0f - Fr(L, N)?

(Asked by: username_0 on 2024-10-25)

Dassault Systèmes has a spec for their PBR material: [Enterprise PBR 2025](https://dassaultsystemes-technology.github.io/EnterprisePBRShadingModel/spec-2025x.md.html)

I rewrite Eq. 72 for clarity:

`CoatedBRDF(…) = GlitteryCoreBRDF(…) * (1.0f − clearcoatWeight * CoatReflectedLight) + ClearcoatBRDF() * clearcoatWeight * Fresnel(H, V)`

I understand that the reason we multiply the GlitteryCoreBRDF by `(1.0f - clearcoatWeight * CoatReflectedlight)` is because only the transmitted part of the light goes through the coat layer to the glittery core so the GlitteryCore only gets `1.0f - CoatReflectedLight` of the total incoming light.

The question is: why is `CoatReflectedLight` using `max(Fresnel(V, N), Fresnel(L, N)))` instead of just `Fresnel(N, L)`?

**Tags:** brdf, pbr, specular, fresnel


---

## 1 answers

### Answer by username_1 on 2024-10-27. Score: 1 | Accepted answer

I believe it is just another way to preserve the Fresnel effect for both light incident ray and view incident ray, since the whole diffuse substrate radiance should go through:

1. The light chooses to refract into the coat and hits the substrate.
2. Reflected by the diffuse substrate.
3. The light chooses to refract out from the coat (which should be equivalent to view vector refracting into the coat).

> [![mitsuba3 BSDF document](https://i.sstatic.net/65PoozxB.png)](https://i.sstatic.net/65PoozxB.png) (from [Mitsuba3 docs BSDF plastic](https://mitsuba.readthedocs.io/en/stable/src/generated/plugins_bsdfs.html#bsdf-roughplastic))

Therefore, both 1. and 3. should have Fresnel term. However, in Mitsuba3, similar (is it?) materials like plastic tend to this term different from what you have listed in your post:

```cpp
// from mistuba3 mitsuba3/src/bsdfs/plastic.cpp, `sample` function
value *= m_inv_eta_2 * (1.f - f_i) * (1.f - f_o) / prob_diffuse;

```

This should be the physically based way to incorporate both Fresnel terms, but my experiment suggests that it will make the diffuse substrate appear darker, see the following figures. So my answer (my guess), would be:

* Use `max` to preserve both Fresnel terms, so that the appearance is generally correct.
* `max` instead of the product makes the substrate looks brighter.

The following figures have subtle differences between each other, so it is suggested that you download them and check the differences by quick swapping. The Vader helmet in the following scene employs the plastic material.

| `max` Fresnel | product F | F(N,L) only | F(N,V) only |
| --- | --- | --- | --- |
| [vader-fresnel-max](https://i.sstatic.net/pByktNfg.png) | [vader-fresnel-product](https://i.sstatic.net/Jpzq9no2.png) | [vader-fresnel-nl](https://i.sstatic.net/jt43QW4F.png) | [vader-fresnel-nv](https://i.sstatic.net/blRPmFUr.png) |

> **Comments:**
> **username_0**: Additional question: what's `m_inv_eta_2` for in mitsuba's implementation? @username_1  
> **username_1**: I think it has something to do with non-symmetric scattering. See [PBR-book v3 16.1 Non-symmetry Due to Refraction](https://pbr-book.org/3ed-2018/Light_Transport_III_Bidirectional_Methods/The_Path-Space_Measurement_Equation) and Eric Veach Thesis Chapter 5 (5.2  Non-symmetry due to refraction).  

---

