Sign in to follow this  
CryZe

Blinn-Phong Specular Exponent to Trowbridge-Reitz Roughness

Recommended Posts

CryZe    773
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 [img]http://public.gamedev.net//public/style_emoticons/default/sad.png[/img] Edited by CryZe

Share this post


Link to post
Share on other sites
Hodgman    51234
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 [img]http://public.gamedev.net//public/style_emoticons/default/unsure.png[/img]

Share this post


Link to post
Share on other sites
CryZe    773
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 [img]http://public.gamedev.net//public/style_emoticons/default/sad.png[/img]
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] Edited by CryZe

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this