Jump to content
  • Advertisement
Sign in to follow this  
CDProp

Good rim lighting with Blinn-Phong

This topic is 2028 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

So, let's say I'm using a normalized Blinn-Phong BRDF. Here is the one from Real-Time Rendering, Third Edition, p. 257, Eq. 7.49:

 

Ukypzpa.png

 

Where:

 

cdiff is the diffuse reflectance

RF is the Fresnel term (Schlick's approximation)

?h is the angle between the view vector and the half vector

m is the specular exponent

?h is the angle between the normal and the half vector.

 

Now, this entire thing gets multiplied by the irradiance to get the final radiance:

 

AMHTDCY.png

 

It seems from this that it's quite difficult to get a nice Fresnel sheen, particularly on rough materials like asphalt. This is because, in order to maximize the specular term of the BRDF, both the view vector and the light vector have to be at grazing angles with the surface being rendered. Unfortunately, when the light vector is at a grazing angle with the surface, the irradiance factor is near zero, and so you don't get much light at all.

 

The situation can be somewhat improved by using a large m. Then, the normalization factor is large and this results in some light. However, it also results in a very sharp highlight, which is not helpful if the material is supposed to be rough.

 

In fact, it's difficult for me to envision a scenario where you can get strong Fresnel, strong n_dot_h, and strong irradiance.

 

I could divide the specular term by the clamped n_dot_l, but I'll have to add a small epsilon to avoid a singularity when n_dot_l is zero. Also, that seems to be sort of a hack without any physical basis and it doesn't conserve energy.

 

Is my thinking wrong?

 

 

Share this post


Link to post
Share on other sites
Advertisement

You have two choices , either go for a more physical correct BRDF or modify the formula.

 

Eg you could leave the  energy preservation (m+8/8pi) out of the formula. Rim light is a stage lighting setup to highlight the silhouette of the actor often used in movies and games, so it is an artificial light setup. Therefor there's no real reason to make it perfect smile.png

Share this post


Link to post
Share on other sites

It seems from this that it's quite difficult to get a nice Fresnel sheen, particularly on rough materials like asphalt. This is because, in order to maximize the specular term of the BRDF, both the view vector and the light vector have to be at grazing angles with the surface being rendered. Unfortunately, when the light vector is at a grazing angle with the surface, the irradiance factor is near zero, and so you don't get much light at all.

Maybe you've got everything correct, but asphalt is actually just smoother than you think it is?
 
I've usually actually got the opposite problem - that the Fresnel ends up making rough objects too shiny/bright when under a "rim light" situation! Usually I have to hack the Fresnel function to make it artificially return lower values for rougher surfaces, to avoid them becoming 100% reflective at grazing angles.

Share this post


Link to post
Share on other sites

You have two choices , either go for a more physical correct BRDF or modify the formula.

 

Eg you could leave the  energy preservation (m+8/8pi) out of the formula. Rim light is a stage lighting setup to highlight the silhouette of the actor often used in movies and games, so it is an artificial light setup. Therefor there's no real reason to make it perfect smile.png

 

Fair enough, although even if the lighting setup is artificial, the physics is real. Objects really do appear to create a bright sheen at glancing angles, even if they're somewhat rough. I certainly don't mind including unrealistic approximations in my equations (I'm already doing that), but it bothers me if I am doing something cartoonishly unrealistic (like using a non-energy-conserving BRDF that has infinite reflectance in certain directions).

 

 

It seems from this that it's quite difficult to get a nice Fresnel sheen, particularly on rough materials like asphalt. This is because, in order to maximize the specular term of the BRDF, both the view vector and the light vector have to be at grazing angles with the surface being rendered. Unfortunately, when the light vector is at a grazing angle with the surface, the irradiance factor is near zero, and so you don't get much light at all.

Maybe you've got everything correct, but asphalt is actually just smoother than you think it is?
 
I've usually actually got the opposite problem - that the Fresnel ends up making rough objects too shiny/bright when under a "rim light" situation! Usually I have to hack the Fresnel function to make it artificially return lower values for rougher surfaces, to avoid them becoming 100% reflective at grazing angles.

 

 

I suppose it's possible that asphalt is smoother than I think it is. Even at fairly sharp exponents, the glare I get is hardly blinding. At m=256, the asphalt looks wet but the highlight is still quite dim (the normalization term is about 10.5, which becomes smaller once the BRDF is multiplied by the n_dot_l term). You say that your Fresnel term is 100% reflective at grazing angles -- this makes sense, but are you multiplying this term by n_dot_l? That should dim things quite a bit. Do you by chance have any code samples on your blog that I can look at, to see your lighting equation?

Share this post


Link to post
Share on other sites

Yeah I use nDotL, but I've moved over to GGX. If you download BRDF explorer, I think it's got some examples of normalized Blinn phong.

How bright is your diffuse value - if it's unrealisticly high, it will hide your spec somewhat. Also, the fresnel effect should cause the diffuse lighting to become black/zero at glancing angles (if 100% is being reflected, then 0% is being diffused due to energy conservation) -- this phenomenon will make the "rim specular" more obvious, whereas without this phenomenon, the diffuse lighting may be overpowering and hiding the specular.

What's your spec-mask/F0/fresnel at incidence zero value?
Fresnel should have the effect of taking the asphalt from about 3% reflectivity up to 100%, which is a huge increase by itself, even with nDotL.

Edited by Hodgman

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!