<p>To understand whether your steps are correct you should compare to the mathematical formulation.</p>
<p><strong>Step 1</strong> is supposedly solving the rendering equation for some collection of initial rays</p>
<p><span class="math-container">$$L_o(x_0, \omega_o) = L_e(x, \omega_o) + \int_{\mathcal{H}^2(x_0, N_{x_0})} f(\omega_o, x_0, \omega_i)L_i(x_0,\omega_i)(N_{x_0}\cdot \omega_i)\,d\omega_i.$$</span></p>
<p>Here <span class="math-container">$L_o(x_0,\omega_o)$</span> is the outgoing radiance function, i.e. the radiance leaving some surface point <span class="math-container">$x_0$</span> in direction <span class="math-container">$\omega_o$</span>. <span class="math-container">$L_e(x_0,\omega_o)$</span> is the emitted radiance function, i.e. the radiance emitted from point <span class="math-container">$x_0$</span> in direction <span class="math-container">$\omega_o$</span>. Next we have an integral over the hemisphere at point <span class="math-container">$x_0$</span> whose up direction is aligned with the normal <span class="math-container">$N_{x_0}$</span> at <span class="math-container">$x_0$</span>. You can formalize this set as <span class="math-container">$\mathcal{H}^2(x_0,N_{x_0}) = \{z\in\mathbb{R}^3\,:\, \|z-x_0\|=1, \, (z-x_0)\cdot N_{x_0}\geq 0\}$</span>, in practice one parametrizes it using spherical coordinates. <span class="math-container">$f$</span> is the BRDF. <span class="math-container">$L_i$</span> is the incident radiance function, i.e. <span class="math-container">$L_i(x_0,\omega_i) = L_o(r(x_0, \omega_i), -\omega_i)$</span>, where <span class="math-container">$r$</span> is the ray-tracing function. Finally <span class="math-container">$(N_{x_0}\cdot \omega_i) = \cos\theta_i$</span> is the Lambertian cosine term that accounts for the angle between the ray and the surface.</p>
<p>For simplicity the above can be rewritten using linear operator notation as <span class="math-container">$L = L_e + TL$</span>, from where one may get the Neumann expansion <span class="math-container">$L = \sum_{k=0}^{\infty}T^kL_e$</span>, which is essentially a sum of increasingly dimensional integrals. You typically apply Monte Carlo to get an approximate solution of the latter.</p>
<p>The question is also how you choose the rays. Since you mentioned that you have an aperture, a film, and an exposure time, let us model the aperture as some set <span class="math-container">$\mathcal{A}\subset\mathbb{R}^3$</span>, the film as <span class="math-container">$\mathcal{F}\subset\mathbb{R}^3$</span>, and the exposure time as an interval <span class="math-container">$[t_0,t_1]$</span>. Both of <span class="math-container">$\mathcal{F}$</span> and <span class="math-container">$\mathcal{A}$</span> are two-dimensional manifolds, and usually <span class="math-container">$\mathcal{A}$</span> is chosen to be a disk some distance in front of the film <span class="math-container">$\mathcal{F}$</span>, and <span class="math-container">$\mathcal{F}$</span> is chosen to be a rectangle (in order to match the screen). The response at a given pixel (i,j) can be modeled as a weighted integration over the arriving radiance on the film, with some sensitivity function <span class="math-container">$w_{ij}$</span>:
<span class="math-container">$$I_{ij} = \int_{t_0}^{t_1}\int_{\mathcal{F}}\int_{\mathcal{A}_{\mathcal{H}^2(x_{-1}, N_{x_{-1}})}}w_{ij}(x_{-1}, -\omega_o)L_i(x_{-1}, -\omega_o))(N_{x_{-1}}\cdot (-\omega_o))\, d(-\omega_o)dx_{-1}dt.$$</span></p>
<p>Here <span class="math-container">$\mathcal{A}_{\mathcal{H}^2(x_{-1}, N_{x_{-1}})}$</span> is the solid angle set of the aperture as seen from pixel <span class="math-container">$x_{-1}$</span>. Here I have assumed that nothing depends on time (i.e. brdf, scene geometry, lights, aperture, film, sensitivity, all stay the same). With this assumption you can pop out the time integral as a <span class="math-container">$(t_1-t_0)$</span> multiplicative term as you describe in <strong>Step 5</strong>.</p>
<p>Note that physically the aperture is typically in front of the sensor, so I have modeled that instead of what you did. One could of course set the aperture behind the sensor in CG for convenience, and then you would get the solid angle of the film pixel's set as you do. I will however stick to the physical formulation of the aperture being in front of the sensor. We also need to get rid of that cosine dot product and want to integrate only over the pixel and not the whole film, which can be done by setting the sensitivity <span class="math-container">$w_{ij}(x_{-1},-\omega_o) = \frac{\boldsymbol{1}_{\mathcal{P}_{ij}}(x_{-1})}{N_{x_{-1}}\cdot (-\omega_o)}$</span>. Here <span class="math-container">$\mathcal{P}_{ij}\subset \mathcal{F}$</span> is the set of points of the pixel on the film, and <span class="math-container">$\boldsymbol{1}_{\mathcal{X}}$</span> is the indicator function (it is one on the set, and zero outside of it). You want to average the radiance (<strong>step 2</strong>) and then multiply by the solid angle measure of the aperture as seen by a specific point <span class="math-container">$x_{-1}$</span> (<strong>step 3</strong> in your aperture/pixel reversed scenario has the solid angle of the pixel), and the area of the pixel (<strong>step 4</strong> has the area of the aperture). This flip of the aperture and film pixel is not really an issue as noted, but I'll stick to the physical convention (i.e. the reverse of yours). The main issue is that averaging and then multiplying by the solid angle corresponding to the the aperture as seen by the whole pixel, vs by a single point is slightly wrong. Note that <span class="math-container">$\mathcal{A}_{\mathcal{H}^2(x_{-1}, N_{x_{-1}})}$</span> is defined per point, and it varies for the different points on the film's pixel, so you cannot precompute one value for the pixel and call it a day, unless the pixel consists only of a single point - then it would be valid.</p>
<p>There is another formulation that is amenable to a slight modification of your idea, however it uses the area formulation instead of the solid angle one. Namely</p>
<p><span class="math-container">$$I_{ij} = \int_{t_0}^{t_1}\int_{\mathcal{F}}\int_{\mathcal{A}}w_{ij}(x_{-1}, x_{-1/2})L_i(x_{-1}, -\omega_o))G(x_{-1},x_{-1/2})\, d x_{-1/2}dx_{-1}dt.$$</span></p>
<p>Here <span class="math-container">$x_{-1/2}$</span> is a point on the aperture, and <span class="math-container">$-\omega_o = \frac{x_{-1/2}-x_{-1}}{\|x_{-1/2}-x_{-1}\|}$</span>, and <span class="math-container">$G(x_{-1},x_{-1/2}) = \frac{(N_{x_{-1}}\cdot(-\omega_o))(N_{x_{-1/2}}\cdot \omega_o)}{\|x_{-1/2}-x_{-1}\|^2}$</span>. Choose</p>
<p><span class="math-container">$$w_{ij}(x_{-1}, x_{-1/2}) = \frac{\boldsymbol{1}_{\mathcal{P}_{ij}}(x_{-1})}{G(x_{-1},x_{-1/2})},$$</span></p>
<p>where <span class="math-container">$\mathcal{P}_{ij}\subseteq \mathcal{F}$</span> is the set of pixel <span class="math-container">$(i,j)$</span> on the film, and <span class="math-container">$\boldsymbol{1}_{\mathcal{X}}$</span> is the indicator function. Then you get what you want, with the small change that you multiply the average by the areas <span class="math-container">$|\mathcal{A}|$</span> and <span class="math-container">$|\mathcal{P}_{ij}|$</span> , without involving solid angles of those.</p>
<p>A general remark I have is that if you want to convert between different units then you need integration and differentiation. The multiplication and division is a special case of this, which is valid only in very specific scenarios. My takeaway from your explanation is that this was the main issue with your understanding of the problem.</p>

CC BY-SA 4.0
2023-11-09T15:53:12.957Z
Thanks for the comprehensive answer, it has been very useful for a problem I am working on right now. However, I don't understand this: "This flip of the aperture and film pixel is not really an issue as noted". For real cameras, usually the pixel size is very small and the solid angle of the aperture can be significant, so that: A. inverting 3 and 4 would produce quite different results; B. The variation of the solid angle of the aperture as seen from a pixel, for different points in a pixel would be negligible, so to me, you could indeed precompute this solid angle for each pixel.
Milo
CC BY-SA 4.0
2023-11-09T18:56:20.847Z
@Milo The flip is just a reflected version of what happens in reality so you don't have to negate x and y. It shouldn't change anything beyond that due to the inherent symmetry in a reflection.
lightxbulb
CC BY-SA 4.0
2023-11-10T09:57:56.700Z
@ilghtxbulb Ah, I understand now, I thought the "flip" referred to applying the solid angle to the pixel and the area to the aperture, whereas it should be the other way around (as in your answer). Thanks for the clarification.
Milo
CC BY-SA 4.0
2023-02-04T16:59:25.543Z
2023-02-04T17:10:00.450Z
2023-02-04T17:10:00.450Z
lightxbulb
<p><em>NOTE: Deleting the question to rephrase it after continuing to read other responses and toy around with it:</em></p>
<p>I've written a path tracer and am now working on implementing a physically accurate way of simulating the actual sensor response <strong>for a given wavelength</strong><span class="math-container">$^*$</span>, given an exposure time, aperture size, pixel size, and quantum efficiency.</p>
<p>The current way I've thought about framing this is as follows (this algorithm is done for <em>each</em> pixel):</p>
<ol>
<li>Path-trace many rays and evaluate the <a href="https://en.wikipedia.org/wiki/Bidirectional_reflectance_distribution_function" rel="nofollow noreferrer">Bidirectional Reflectance Distribution Function (BRDF)</a> (or BTDF/BSDF) to obtain the radiance along each ray received by the pixel.  <em>This part is done</em>.</li>
<li>Take all of the rays received by a pixel, and average their radiance values to obtain a &quot;received&quot; radiance (units of <span class="math-container">$[W\cdot sr^{-1} \cdot m^{-2}]$</span>) for the pixel.</li>
<li>Look up the solid angle field-of-view of a pixel (this is precalculated beforehand) and multiply that solid angle by the <em>radiance</em> to obtain the <em>irradiance</em> (units of <span class="math-container">$[W\cdot m^{-2}]$</span>)</li>
<li>Multiply the <em>irradiance</em> by the area of the aperture to obtain the received <em>power</em> (units of <span class="math-container">$[W]$</span>)</li>
<li>Multiply the <em>power</em> by the exposure time to obtain the <em>energy</em> (units of <span class="math-container">$[J]$</span>)</li>
<li>Divide the energy by the photon energy (given by <span class="math-container">$E = h f$</span>) for a given wavelength to obtain the photon count.</li>
<li>Multiply the photon count by the quantum efficiency and generate the signal.</li>
</ol>
<p>Is this the correct way of calculating this?  My primary concern is in <strong>steps 2 and 3</strong> as I am not terribly comfortable with solid angles.  My rationale is that the solid angle of the pixel's field-of-view determines how much of the scene is actually contributing light to the pixel, and we're approximating that part of the scene by casting discrete rays which we can then average.  And this should naturally capture the effect that increasing the pixel size correspondingly increases the pixel's solid angle thus an increase in the irradiance at the aperture that contributes to the pixel, and thus increased response.  But like I said, the nature of solid angles has me tripped up, particularly because it is often said that the radiance along a ray is reversible, and so I'm not sure &quot;which&quot; solid angle to actually be using.</p>
<hr />
<p><span class="math-container">$^*$</span> <em>Currently I'm able to assume a single wavelength at a time, however in the future if I were to extend this to handle a broad-spectrum, I would modify <strong>steps 1 and 2</strong> to calculate the spectral radiance with units of <span class="math-container">$[W\cdot sr^{-1} \cdot m^{-2} \cdot Hz^{-1}]$</span>.  Then when we continue on to <strong>step 3</strong> we would calculate a <em>spectral irradiance</em> with units of <span class="math-container">$[W\cdot m^{-2} \cdot Hz^{-1}]$</span>, and then <strong>step 4</strong> would produce a spectral flux with units of <span class="math-container">$[W\cdot Hz^{-1}]$</span>.  Then we calculate the energy of photons for each frequency in our spectrum to obtain the photon counts for each frequency and then convolve the resulting energy spectrum with the quantum efficiency spectrum.</em></p>

CC BY-SA 4.0
2023-02-03T03:17:37.930Z
Generally steps 6 and 7 are omitted in graphics. Consider the measurement integral $$I_{i,j}= \int_{t_0}^{t_1}\int_{x_i}^{x_{i+1}}\int_{y_j}^{y_{j+1}}\int_{\mathcal{H}^2}w(\vec{z}(x,y),\omega,t)L_i(\vec{z}(x,y),\omega,t)\cos\theta \sqrt{det[J_{\vec{z}}^TJ_{\vec{z}}]}\,d\omega dy dx dt,$$ which return the sensor response for pixel $(i,j)$ spanning some film surface $\{\vec{z}(x,y)\,:\, (x,y) \in [x_i,x_{i+1}]\times [y_j, y_{j+1}]\}$, over some time interval $[t_0, t_1]$, with sensor response function $w$. The term involving $J$ is for change of variables parametrization of the film.
lightxbulb
CC BY-SA 4.0
2023-02-03T22:23:07.250Z
I can understand omitting those steps, however is the outline of my approach here correct?
Chris Gnam
<raytracing><photo-realistic><radiosity><photometric><light>
How is Aperture and Pixel Size accounted for in calculating received power using ray tracing?
Chris Gnam
# How is Aperture and Pixel Size accounted for in calculating received power using ray tracing?

(Asked by: username_0 on 2023-02-02)

*NOTE: Deleting the question to rephrase it after continuing to read other responses and toy around with it:*

I've written a path tracer and am now working on implementing a physically accurate way of simulating the actual sensor response **for a given wavelength**$^\*$, given an exposure time, aperture size, pixel size, and quantum efficiency.

The current way I've thought about framing this is as follows (this algorithm is done for *each* pixel):

1. Path-trace many rays and evaluate the [Bidirectional Reflectance Distribution Function (BRDF)](https://en.wikipedia.org/wiki/Bidirectional_reflectance_distribution_function) (or BTDF/BSDF) to obtain the radiance along each ray received by the pixel. *This part is done*.
2. Take all of the rays received by a pixel, and average their radiance values to obtain a "received" radiance (units of $[W\cdot sr^{-1} \cdot m^{-2}]$) for the pixel.
3. Look up the solid angle field-of-view of a pixel (this is precalculated beforehand) and multiply that solid angle by the *radiance* to obtain the *irradiance* (units of $[W\cdot m^{-2}]$)
4. Multiply the *irradiance* by the area of the aperture to obtain the received *power* (units of $[W]$)
5. Multiply the *power* by the exposure time to obtain the *energy* (units of $[J]$)
6. Divide the energy by the photon energy (given by $E = h f$) for a given wavelength to obtain the photon count.
7. Multiply the photon count by the quantum efficiency and generate the signal.

Is this the correct way of calculating this? My primary concern is in **steps 2 and 3** as I am not terribly comfortable with solid angles. My rationale is that the solid angle of the pixel's field-of-view determines how much of the scene is actually contributing light to the pixel, and we're approximating that part of the scene by casting discrete rays which we can then average. And this should naturally capture the effect that increasing the pixel size correspondingly increases the pixel's solid angle thus an increase in the irradiance at the aperture that contributes to the pixel, and thus increased response. But like I said, the nature of solid angles has me tripped up, particularly because it is often said that the radiance along a ray is reversible, and so I'm not sure "which" solid angle to actually be using.

---

$^\*$ *Currently I'm able to assume a single wavelength at a time, however in the future if I were to extend this to handle a broad-spectrum, I would modify **steps 1 and 2** to calculate the spectral radiance with units of $[W\cdot sr^{-1} \cdot m^{-2} \cdot Hz^{-1}]$. Then when we continue on to **step 3** we would calculate a *spectral irradiance* with units of $[W\cdot m^{-2} \cdot Hz^{-1}]$, and then **step 4** would produce a spectral flux with units of $[W\cdot Hz^{-1}]$. Then we calculate the energy of photons for each frequency in our spectrum to obtain the photon counts for each frequency and then convolve the resulting energy spectrum with the quantum efficiency spectrum.*

**Tags:** raytracing, photo-realistic, radiosity, photometric, light

> **Comments:**
> **username_1**: Generally steps 6 and 7 are omitted in graphics. Consider the measurement integral $$I_{i,j}= \int_{t_0}^{t_1}\int_{x_i}^{x_{i+1}}\int_{y_j}^{y_{j+1}}\int_{\mathcal{H}^2}w(\vec{z}(x,y),\omega,t)L_i(\vec{z}(x,y),\omega,t)\cos\theta \sqrt{det[J_{\vec{z}}^TJ_{\vec{z}}]}\,d\omega dy dx dt,$$ which return the sensor response for pixel $(i,j)$ spanning some film surface $\{\vec{z}(x,y)\,:\, (x,y) \in [x_i,x_{i+1}]\times [y_j, y_{j+1}]\}$, over some time interval $[t_0, t_1]$, with sensor response function $w$. The term involving $J$ is for change of variables parametrization of the film.  
> **username_0**: I can understand omitting those steps, however is the outline of my approach here correct?  

---

## 1 answers

### Answer by username_1 on 2023-02-04. Score: 1

To understand whether your steps are correct you should compare to the mathematical formulation.

**Step 1** is supposedly solving the rendering equation for some collection of initial rays

$$L\_o(x\_0, \omega\_o) = L\_e(x, \omega\_o) + \int\_{\mathcal{H}^2(x\_0, N\_{x\_0})} f(\omega\_o, x\_0, \omega\_i)L\_i(x\_0,\omega\_i)(N\_{x\_0}\cdot \omega\_i)\,d\omega\_i.$$

Here $L\_o(x\_0,\omega\_o)$ is the outgoing radiance function, i.e. the radiance leaving some surface point $x\_0$ in direction $\omega\_o$. $L\_e(x\_0,\omega\_o)$ is the emitted radiance function, i.e. the radiance emitted from point $x\_0$ in direction $\omega\_o$. Next we have an integral over the hemisphere at point $x\_0$ whose up direction is aligned with the normal $N\_{x\_0}$ at $x\_0$. You can formalize this set as $\mathcal{H}^2(x\_0,N\_{x\_0}) = \{z\in\mathbb{R}^3\,:\, \|z-x\_0\|=1, \, (z-x\_0)\cdot N\_{x\_0}\geq 0\}$, in practice one parametrizes it using spherical coordinates. $f$ is the BRDF. $L\_i$ is the incident radiance function, i.e. $L\_i(x\_0,\omega\_i) = L\_o(r(x\_0, \omega\_i), -\omega\_i)$, where $r$ is the ray-tracing function. Finally $(N\_{x\_0}\cdot \omega\_i) = \cos\theta\_i$ is the Lambertian cosine term that accounts for the angle between the ray and the surface.

For simplicity the above can be rewritten using linear operator notation as $L = L\_e + TL$, from where one may get the Neumann expansion $L = \sum\_{k=0}^{\infty}T^kL\_e$, which is essentially a sum of increasingly dimensional integrals. You typically apply Monte Carlo to get an approximate solution of the latter.

The question is also how you choose the rays. Since you mentioned that you have an aperture, a film, and an exposure time, let us model the aperture as some set $\mathcal{A}\subset\mathbb{R}^3$, the film as $\mathcal{F}\subset\mathbb{R}^3$, and the exposure time as an interval $[t\_0,t\_1]$. Both of $\mathcal{F}$ and $\mathcal{A}$ are two-dimensional manifolds, and usually $\mathcal{A}$ is chosen to be a disk some distance in front of the film $\mathcal{F}$, and $\mathcal{F}$ is chosen to be a rectangle (in order to match the screen). The response at a given pixel (i,j) can be modeled as a weighted integration over the arriving radiance on the film, with some sensitivity function $w\_{ij}$:
$$I\_{ij} = \int\_{t\_0}^{t\_1}\int\_{\mathcal{F}}\int\_{\mathcal{A}\_{\mathcal{H}^2(x\_{-1}, N\_{x\_{-1}})}}w\_{ij}(x\_{-1}, -\omega\_o)L\_i(x\_{-1}, -\omega\_o))(N\_{x\_{-1}}\cdot (-\omega\_o))\, d(-\omega\_o)dx\_{-1}dt.$$

Here $\mathcal{A}\_{\mathcal{H}^2(x\_{-1}, N\_{x\_{-1}})}$ is the solid angle set of the aperture as seen from pixel $x\_{-1}$. Here I have assumed that nothing depends on time (i.e. brdf, scene geometry, lights, aperture, film, sensitivity, all stay the same). With this assumption you can pop out the time integral as a $(t\_1-t\_0)$ multiplicative term as you describe in **Step 5**.

Note that physically the aperture is typically in front of the sensor, so I have modeled that instead of what you did. One could of course set the aperture behind the sensor in CG for convenience, and then you would get the solid angle of the film pixel's set as you do. I will however stick to the physical formulation of the aperture being in front of the sensor. We also need to get rid of that cosine dot product and want to integrate only over the pixel and not the whole film, which can be done by setting the sensitivity $w\_{ij}(x\_{-1},-\omega\_o) = \frac{\boldsymbol{1}\_{\mathcal{P}\_{ij}}(x\_{-1})}{N\_{x\_{-1}}\cdot (-\omega\_o)}$. Here $\mathcal{P}\_{ij}\subset \mathcal{F}$ is the set of points of the pixel on the film, and $\boldsymbol{1}\_{\mathcal{X}}$ is the indicator function (it is one on the set, and zero outside of it). You want to average the radiance (**step 2**) and then multiply by the solid angle measure of the aperture as seen by a specific point $x\_{-1}$ (**step 3** in your aperture/pixel reversed scenario has the solid angle of the pixel), and the area of the pixel (**step 4** has the area of the aperture). This flip of the aperture and film pixel is not really an issue as noted, but I'll stick to the physical convention (i.e. the reverse of yours). The main issue is that averaging and then multiplying by the solid angle corresponding to the the aperture as seen by the whole pixel, vs by a single point is slightly wrong. Note that $\mathcal{A}\_{\mathcal{H}^2(x\_{-1}, N\_{x\_{-1}})}$ is defined per point, and it varies for the different points on the film's pixel, so you cannot precompute one value for the pixel and call it a day, unless the pixel consists only of a single point - then it would be valid.

There is another formulation that is amenable to a slight modification of your idea, however it uses the area formulation instead of the solid angle one. Namely

$$I\_{ij} = \int\_{t\_0}^{t\_1}\int\_{\mathcal{F}}\int\_{\mathcal{A}}w\_{ij}(x\_{-1}, x\_{-1/2})L\_i(x\_{-1}, -\omega\_o))G(x\_{-1},x\_{-1/2})\, d x\_{-1/2}dx\_{-1}dt.$$

Here $x\_{-1/2}$ is a point on the aperture, and $-\omega\_o = \frac{x\_{-1/2}-x\_{-1}}{\|x\_{-1/2}-x\_{-1}\|}$, and $G(x\_{-1},x\_{-1/2}) = \frac{(N\_{x\_{-1}}\cdot(-\omega\_o))(N\_{x\_{-1/2}}\cdot \omega\_o)}{\|x\_{-1/2}-x\_{-1}\|^2}$. Choose

$$w\_{ij}(x\_{-1}, x\_{-1/2}) = \frac{\boldsymbol{1}\_{\mathcal{P}\_{ij}}(x\_{-1})}{G(x\_{-1},x\_{-1/2})},$$

where $\mathcal{P}\_{ij}\subseteq \mathcal{F}$ is the set of pixel $(i,j)$ on the film, and $\boldsymbol{1}\_{\mathcal{X}}$ is the indicator function. Then you get what you want, with the small change that you multiply the average by the areas $|\mathcal{A}|$ and $|\mathcal{P}\_{ij}|$ , without involving solid angles of those.

A general remark I have is that if you want to convert between different units then you need integration and differentiation. The multiplication and division is a special case of this, which is valid only in very specific scenarios. My takeaway from your explanation is that this was the main issue with your understanding of the problem.

> **Comments:**
> **username_2**: Thanks for the comprehensive answer, it has been very useful for a problem I am working on right now. However, I don't understand this: "This flip of the aperture and film pixel is not really an issue as noted". For real cameras, usually the pixel size is very small and the solid angle of the aperture can be significant, so that: A. inverting 3 and 4 would produce quite different results; B. The variation of the solid angle of the aperture as seen from a pixel, for different points in a pixel would be negligible, so to me, you could indeed precompute this solid angle for each pixel.  
> **username_1**: @username_2 The flip is just a reflected version of what happens in reality so you don't have to negate x and y. It shouldn't change anything beyond that due to the inherent symmetry in a reflection.  
> **username_2**: @ilghtxbulb Ah, I understand now, I thought the "flip" referred to applying the solid angle to the pixel and the area to the aperture, whereas it should be the other way around (as in your answer). Thanks for the clarification.  

---

