5
$\begingroup$

Link to paper : Irradiance and Incoming Radiance | lawrence.edu

Using a shader to compute En

enter image description here

Computing En as described above is a very compute intensive operation, because we have to compute the integral over the cube map for each new direction vector n that we want to work with. At the same time, the details for different values of n are highly repetitive. This suggests that we should enlist the aid of shaders to compute this mapping for us. Here is the outline of a strategy that makes it possible to do this.

  1. Use OpenGL to render a two dimensional square centered at the origin with sides of length 2. This square represents one of the sides of our cubical irradiance map. Given the mapping above we can map any point (x , y) on the square to a direction vector n.
  2. We render the square to a framebuffer with dimensions size by size pixels, where size is the desired size of our irradiance cube map texture.
  3. In the fragment shader, we translate the interpolated fragment positions we are given into direction vectors n and construct loops that sum over the six faces of the environment map:

When rendering is done, we convert the image in the frame buffer to a texture for use by our irradiance cube map.

I understand that Li is color at i. ωi is the direction of incoming light.

However I do not understand what dωi is.

Paper describes it as...

Computing the solid angle dωi subtended by a particular texel is a little more involved. Texels near the center of the texture subtend a somewhat larger angle, while texels near the corner take up a smaller solid angle when we map the cube texture onto a sphere. Here is a reference that explains how to compute the solid angle correctly from the positions xi and yi.

However I am not following words to understand what it means.

$\endgroup$
  • 2
    $\begingroup$ Are you familiar with differentials in calculus, like $dy/dx$ and such? Are you familiar with the concept of solid angle? $\endgroup$ – Nathan Reed Apr 6 '17 at 23:33
  • $\begingroup$ @NathanReed yes I am familiar with dy/dx but I am not familiar with concept of solid angle. $\endgroup$ – Blue Bug Apr 7 '17 at 0:31
  • $\begingroup$ @NathanReed ok soI did more research and I think I have better understanding of solid angle. Solid angle ranges from 0~4 pi. But what does differential of solid angle of the normal vector at "i" mean? $\endgroup$ – Blue Bug Apr 7 '17 at 5:58
  • $\begingroup$ It looks like an integral that's been quantified. $\endgroup$ – ratchet freak Apr 7 '17 at 8:40
6
$\begingroup$

$E_n$ is illuminance (or irradiance), $L_i$ is luminance (or radiance) in direction $\omega_i$ and $d\omega$ is differential solid angle.

TL;DR: $d\omega_i$ is the area of a pixel in the cubemap projected onto the unit sphere.

And then a longer explanation (:

Solid angle is essentially the projected area of an object on a unit sphere and has unit of steradians (sr). Entire unit sphere has surface area of $4\pi$ and hemisphere has the area of $2\pi$, which comes up a lot in lighting calculations due to integrals over spheres and hemispheres respectively.

If you would want to calculate solid angle for an object and point $p$, you would project the object on the unit sphere at $p$ and calculate the area of the projection. Further the object is from $p$ smaller the solid angle gets. As an example, we can calculate solid angle for Sun as seen from the Earth. We know that Sun has about 0.52 degrees subtended angle from Earth, so we can calculate that the solid angle is: $$2\pi*(1-Cos(0.52/2))\simeq0.00006469sr$$

So the differential solid angle is just an infinitesimally small solid angle. If you would numerically integrate over a sphere ($4\pi$ steradians) by taking $N$ uniform samples on the sphere, your $d\omega$ would be $4\pi/N$. With integrals $N$ goes to infinity, while with numerical approximation of the integral $N$ is some "sufficiently large" number.

However, in this paper you refer to they perform integration by rendering to a cubemap at $p$ and then iterating through all the rendered pixels. But because these pixels are rendered onto planes (cubemap faces), their projection on the unit sphere isn't constant, so $d\omega$ needs to be weighted by the position in the rendered image, which they explain in your second quote:

Computing the solid angle dωi subtended by a particular texel is a little more involved. Texels near the center of the texture subtend a somewhat larger angle, while texels near the corner take up a smaller solid angle when we map the cube texture onto a sphere.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.