Skip to main content
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
added 14 characters in body
Source Link

This is standard Cook-Torrance BRDF in formulation for a single point light. No intergrals over a hemisphere, just a single direction to a source of incoming energy.

$$ L_o = { \bigg ( (1-F) \frac{albedo \cdot (1-metallness)}{\pi} + \frac{F \cdot D \cdot G_2}{4 (n \cdot v)(n \cdot l_i) } \bigg ) \cdot L_i \cdot (n \cdot l_i ) } $$

  • $L_o$ - outgoing pixel energy
  • $L_i$ - incoming energy
  • $l_i$ - direction to a light source
  • $n$ - pixel normal
  • $v$ - direction to the camera
  • $F$ - calculated Fresnel, ratio of specularly reflected energy, in range [0; 1]
  • $D$ - calculated integral of GGX NDF over some set of possible micronormal directions (depends on light source size and direction), in range [0; 1]
  • $G_2$ - calculated Smith geometry masking factor, in range [0; 1]

Usually $D$ in papers is just NDF sampled at one point, which is, of couse, won't give correct value, since it's a probablity density function and its values may exceed [0; 1] range.

$G_2 = G_1(v) * G_1(l)$ doesn't go higher than 1 if we use this Smith $G_1$ formulation:

$G_1(dir) = \frac{2 (n \cdot dir)}{(n \cdot dir)+ \sqrt{a^2 + (1 - a^2) (n \cdot dir)^2}}$ , so it's good as well as $F$.

$(n \cdot l_i )$ in the denominator is cancelled out for the specular part.

Question 1: what's wrong with the $(n \cdot v )$ in the specular denominator? At grazing angles why do we need to divide the specular part by some small value getting big values as result? Or should it be cancelled out due to the fact that we render on per-pixel basis and a pixel covers bigger area of surface at grazing angles and already takes whis divider into accout?

Question 2: there are some "approximation" of Smith $G_2$ like this (Earl Hammon, PBR Diffuse Lighting for GGX + Smith Microsurfaces, GDC 2017):

$$ \frac{G_2}{4 (n \cdot v) (n \cdot l)} = \frac{0.5}{lerp((n \cdot v) \cdot (n \cdot l), (n \cdot v) + (n \cdot l), \alpha) } $$

Again, why this one gives large values when dot products are close to zero?

This is standard Cook-Torrance BRDF in formulation for a single point light. No intergrals over a hemisphere, just a single direction to a source of incoming energy.

$$ L_o = { \bigg ( (1-F) \frac{albedo \cdot (1-metallness)}{\pi} + \frac{F \cdot D \cdot G_2}{4 (n \cdot v)(n \cdot l_i) } \bigg ) \cdot L_i \cdot (n \cdot l_i ) } $$

  • $L_o$ - outgoing pixel energy
  • $L_i$ - incoming energy
  • $l_i$ - direction to a light source
  • $n$ - pixel normal
  • $v$ - direction to the camera
  • $F$ - calculated Fresnel, ratio of specularly reflected energy, in range [0; 1]
  • $D$ - calculated integral of GGX NDF over some set of possible micronormal directions (depends on light source size), in range [0; 1]
  • $G_2$ - calculated Smith geometry masking factor, in range [0; 1]

Usually $D$ in papers is just NDF sampled at one point, which is, of couse, won't give correct value, since it's a probablity density function and its values may exceed [0; 1] range.

$G_2 = G_1(v) * G_1(l)$ doesn't go higher than 1 if we use this Smith $G_1$ formulation:

$G_1(dir) = \frac{2 (n \cdot dir)}{(n \cdot dir)+ \sqrt{a^2 + (1 - a^2) (n \cdot dir)^2}}$ , so it's good as well as $F$.

$(n \cdot l_i )$ in the denominator is cancelled out for the specular part.

Question 1: what's wrong with the $(n \cdot v )$ in the specular denominator? At grazing angles why do we need to divide the specular part by some small value getting big values as result? Or should it be cancelled out due to the fact that we render on per-pixel basis and a pixel covers bigger area of surface at grazing angles and already takes whis divider into accout?

Question 2: there are some "approximation" of Smith $G_2$ like this (Earl Hammon, PBR Diffuse Lighting for GGX + Smith Microsurfaces, GDC 2017):

$$ \frac{G_2}{4 (n \cdot v) (n \cdot l)} = \frac{0.5}{lerp((n \cdot v) \cdot (n \cdot l), (n \cdot v) + (n \cdot l), \alpha) } $$

Again, why this one gives large values when dot products are close to zero?

This is standard Cook-Torrance BRDF in formulation for a single point light. No intergrals over a hemisphere, just a single direction to a source of incoming energy.

$$ L_o = { \bigg ( (1-F) \frac{albedo \cdot (1-metallness)}{\pi} + \frac{F \cdot D \cdot G_2}{4 (n \cdot v)(n \cdot l_i) } \bigg ) \cdot L_i \cdot (n \cdot l_i ) } $$

  • $L_o$ - outgoing pixel energy
  • $L_i$ - incoming energy
  • $l_i$ - direction to a light source
  • $n$ - pixel normal
  • $v$ - direction to the camera
  • $F$ - calculated Fresnel, ratio of specularly reflected energy, in range [0; 1]
  • $D$ - calculated integral of GGX NDF over some set of possible micronormal directions (depends on light source size and direction), in range [0; 1]
  • $G_2$ - calculated Smith geometry masking factor, in range [0; 1]

Usually $D$ in papers is just NDF sampled at one point, which is, of couse, won't give correct value, since it's a probablity density function and its values may exceed [0; 1] range.

$G_2 = G_1(v) * G_1(l)$ doesn't go higher than 1 if we use this Smith $G_1$ formulation:

$G_1(dir) = \frac{2 (n \cdot dir)}{(n \cdot dir)+ \sqrt{a^2 + (1 - a^2) (n \cdot dir)^2}}$ , so it's good as well as $F$.

$(n \cdot l_i )$ in the denominator is cancelled out for the specular part.

Question 1: what's wrong with the $(n \cdot v )$ in the specular denominator? At grazing angles why do we need to divide the specular part by some small value getting big values as result? Or should it be cancelled out due to the fact that we render on per-pixel basis and a pixel covers bigger area of surface at grazing angles and already takes whis divider into accout?

Question 2: there are some "approximation" of Smith $G_2$ like this (Earl Hammon, PBR Diffuse Lighting for GGX + Smith Microsurfaces, GDC 2017):

$$ \frac{G_2}{4 (n \cdot v) (n \cdot l)} = \frac{0.5}{lerp((n \cdot v) \cdot (n \cdot l), (n \cdot v) + (n \cdot l), \alpha) } $$

Again, why this one gives large values when dot products are close to zero?

Source Link

BRDF for point lights should not return values over 1

This is standard Cook-Torrance BRDF in formulation for a single point light. No intergrals over a hemisphere, just a single direction to a source of incoming energy.

$$ L_o = { \bigg ( (1-F) \frac{albedo \cdot (1-metallness)}{\pi} + \frac{F \cdot D \cdot G_2}{4 (n \cdot v)(n \cdot l_i) } \bigg ) \cdot L_i \cdot (n \cdot l_i ) } $$

  • $L_o$ - outgoing pixel energy
  • $L_i$ - incoming energy
  • $l_i$ - direction to a light source
  • $n$ - pixel normal
  • $v$ - direction to the camera
  • $F$ - calculated Fresnel, ratio of specularly reflected energy, in range [0; 1]
  • $D$ - calculated integral of GGX NDF over some set of possible micronormal directions (depends on light source size), in range [0; 1]
  • $G_2$ - calculated Smith geometry masking factor, in range [0; 1]

Usually $D$ in papers is just NDF sampled at one point, which is, of couse, won't give correct value, since it's a probablity density function and its values may exceed [0; 1] range.

$G_2 = G_1(v) * G_1(l)$ doesn't go higher than 1 if we use this Smith $G_1$ formulation:

$G_1(dir) = \frac{2 (n \cdot dir)}{(n \cdot dir)+ \sqrt{a^2 + (1 - a^2) (n \cdot dir)^2}}$ , so it's good as well as $F$.

$(n \cdot l_i )$ in the denominator is cancelled out for the specular part.

Question 1: what's wrong with the $(n \cdot v )$ in the specular denominator? At grazing angles why do we need to divide the specular part by some small value getting big values as result? Or should it be cancelled out due to the fact that we render on per-pixel basis and a pixel covers bigger area of surface at grazing angles and already takes whis divider into accout?

Question 2: there are some "approximation" of Smith $G_2$ like this (Earl Hammon, PBR Diffuse Lighting for GGX + Smith Microsurfaces, GDC 2017):

$$ \frac{G_2}{4 (n \cdot v) (n \cdot l)} = \frac{0.5}{lerp((n \cdot v) \cdot (n \cdot l), (n \cdot v) + (n \cdot l), \alpha) } $$

Again, why this one gives large values when dot products are close to zero?