# BRDF for point lights should not return values over 1

Computer Graphics Asked by Emil Kabirov on August 27, 2021

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?

I think a single direction can be greater than 1.

For a BRDF the integral over the hemisphere must be less than 1 for energy conservation.

If you consider a specular brdf there is only one direction, where brdf > 0 and all other directions return 0. Therefore when integrating over the hemisphere that direction must be much greater than 1.

Answered by Peter on August 27, 2021

## Related Questions

### Why does opengl use 4d matrices for everything?

3  Asked on August 27, 2021 by yoris

### How can i wrap the earth image around a 3D Sphere using OpenGL, GLFW, GLAD, GLM?

2  Asked on August 27, 2021 by b_cass_

### Defining “inside” and “outside” of a 3D space

2  Asked on August 27, 2021 by avatrin

### Using Bresenham’s circle algorithm (or another alternative algorithm) to draw an arc

1  Asked on August 27, 2021 by gusman

1  Asked on August 27, 2021 by imallett

### Which perspective projection matrix to use

1  Asked on August 27, 2021 by nixcc

### Perspective correct interpolation z-buffer

1  Asked on August 27, 2021 by lightxbulb

### How is orthographic projection used in computer graphics technically classified as a projection?

1  Asked on August 27, 2021

### Why negate z when constructing projection matrix OpenGL

2  Asked on August 27, 2021

### UV partial derivatives of a cylinder shape primitive

1  Asked on August 27, 2021 by wdc

### OpenGL Framebuffer with multiple Depthbuffers inside

1  Asked on August 27, 2021

### Efficiently generating mesh for self-generated voxel grid

1  Asked on August 27, 2021 by andygeers

### How do you apply a normal map to a 3d mesh?

1  Asked on August 27, 2021 by calvin-godfrey

### What’s a good research topic in Computer Graphics?

0  Asked on August 27, 2021

### When unsetting a VAO, should you also unbind the associated VBOs?

1  Asked on August 27, 2021 by natew

### Reading from buffer versus calculating on the fly performance

1  Asked on August 27, 2021 by wduk

### How are textures projected onto 3d models in texture painting applications

1  Asked on August 27, 2021 by lenny-white

### Conditionals and branching in shaders

0  Asked on August 27, 2021

### Does atomic functions on same memory location cause an performance issue?

1  Asked on August 27, 2021

### Phong model: why no multiplication by N dot L in specular term?

1  Asked on August 27, 2021 by kuba