Blinn-Phong Specular Exponent to Trowbridge-Reitz Roughness

Started by
1 comment, last by CryZe 11 years, 7 months ago
Is there a good formula to convert the specular exponent (glossiness) of the Blinn-Phong NDF to the roughness value of the Trowbridge-Reitz NDF?
I've tried something like [eqn]\frac{1}{\sqrt{\alpha}}[/eqn], but that doesn't work that well. Is there a better approximation?

I'm currently changing the BRDF to an actual Cook-Torrance BRDF with Trowbridge-Reitz distribution, Schlick fresnel and Smith-Trowbridge-Reitz geometry factor. The BRDF itself is only 27 clock cycles on a Fermi or Kepler GPU (NDotL, NDotH, LDotH, ... not included). It's fast enough, so there's no reason for me to use a weak approximation of Cook-Torrance. But all my models are still storing Blinn-Phong glossiness, that's why I need to convert them.

I actually would want to use an approximation for [eqn]1+\sqrt{1+\alpha\frac{\sqrt{1-(N\cdot L)^2}}{N\cdot L}}[/eqn] though. That's the worst part of the whole BRDF. The 2 square roots alone take 12 clock cycles sad.png
Advertisement
Damn google! I just searched for "Trowbridge Reitz", and despite this being a 70's publication, this thread came up as the 3rd result!

You could always brute-force yourself a conversion look-up table. Render a couple-hundred spheres with a single point light and your full range of spec-power and roughness values. Then compare each "power" image against each "roughness" image to find which one produces the least error, and use that to generate a LUT converter. Repeat with different lighting angles, and average the resulting roughness suggestions for robustness unsure.png
If no one comes up with a solution, I'm probably going to do that. Too bad that the Trowbridge-Reitz NDF isn't that well known sad.png
I could try modifying the conversion function for Beckmann roughness, because they might not differ that much. Beckmann is more well known, so what's the conversion function for the Beckmann NDF?

Update: This, is the approximation I came up with:
[eqn]f(\alpha)=
\begin{cases}
0.773871 - 0.160132 \ln(\alpha) & \alpha\in [0,24] \\
0.606127 - 0.105979 \ln(\alpha) & \alpha\in (24,60] \\
0.4008 - 0.0562807 \ln(\alpha) & \alpha\in (60,\infty)
\end{cases}[/eqn]

This topic is closed to new replies.

Advertisement