09 Real time area lights Steve Marschner CS5625 Spring 2019 - - PowerPoint PPT Presentation
09 Real time area lights Steve Marschner CS5625 Spring 2019 - - PowerPoint PPT Presentation
09 Real time area lights Steve Marschner CS5625 Spring 2019 <latexit
Area lighting
when lights are not point-like, we have an integration problem
- for real time we need fast analytic solutions to (approximations of) this definite integral
- the form of the solution depends on the form of Li and fr.
diffuse
- polygonal lights: analytical solution due to Lambert (1760)
- environment lights: irradiance environment maps
specular
- polygonal lights: linearly transformed cosines
- environment lights: prefiltered environment maps
Lr(v) = Z
Ω
fr(v, l) Li(l) (l · n) dl
<latexit sha1_base64="5cykLyE0VWrwpOC4rThjC1qBA=">ACb3icbZDfbtMwFMbd8G8U2LpxwQUSsqiQWqk0SduxcjExiRsQlRgS3SY1VeQ4J5012wm2E62K9kx7ml3sBl4B3gAnGQgQR7L083fO8fH5owzbTzvuXcun3n7r2N+0HDx9tbnW2d450misKc5ryVJ1ERANnEuaGQ4nmQIiIg7H0dnbKn9cgNIslZ/NOoOlICvJEkaJsVLYeT8LVS8oij7exwGTJgw+ClgRnDTyAcF7wcDPAtZr0JsuQIc0Dg1NisrKbZK2Ol6w6m/6+2NcQOT1zfwaoz9oVdH9813VMdhuN3aDOKU5gKkoZxovfC9zAwSDl/ksiTKMrhoh3kGjJCz8gKFhYlEaCXZb35BX5hlRgnqbJHGlyrf3aURGi9FpGtFMSc6n9zlfi/3CI3yXRZMpnlBiRtBiU5xybFlY04Zgqo4WsLhCpm/4rpKVGEGmt2O6gbS3eu7c3VSrgzFimi1q6Bc5G4TFKex+DauYqdvyzsU3ab2sHJaDSdVA5WMPZ/wfS3g0ejoT8ep8m3YMPjZVoAz1Fz1EP+WgPHaB36BDNEUWX6Ap9Rd9aP5wnzjMHN6VO6bnMfornP5PFCa8nw=</latexit>This is all with no shadows! That is a (large-ish) topic for later in the course.
Diffuse, polygonal lights
In this case the illumination integral simplifies to Lambert worked out a solution to this in 1760
- where the index is understood to wrap around for the last term
- (derivation on board; refer to Eric Heitz’s notes linked on the schedule)
Lr = R π Z
Ω(S)
(n · l) dl
<latexit sha1_base64="Mf+1bOjbrUsK5ynE+094bVt9+c=">ACYXicbZDdbtMwFMfd8LUVGN243I1FhdRJo0nabitCaJO4QWIS46PbpLqKHOeks2Y7wXaqVEeZk/DLVxyzQvwCDjpQIA4kuW/+cH/sX54IbGwTfWt6t23fu3ltb9/8HDjUWdz69RkhWYwYZnI9HlMDQiuYGK5FXCea6AyFnAWX76q82cL0IZn6qNd5jCTdK54yhm1zo6L4jV9ikmrKyvdVSXJeYcKVjUryVsKc9j7sVLhHFgoTlmQWk4XYwWQ3cXvU6Qb9cbgXHAzxSoye34j9IQ7QRPdwx+oiZNos7VBkowVEpRlghozDYPc7qYCPqlZSbXlTEDVJoWBnLJLOoepk4pKMLOy+WuFnzonwWm3VIWN+6fHSWVxixl7ColtRfm31xt/i83LWw6npVc5YUFxVaD0kJgm+EaHE64BmbF0gnKNHdvxeyCOmzW4W2TprH0J8adfKOlf8xjTfXSt3AlU58rJoEfDdX86tnC3eV+01DcDQYjEc1wVoMw19i/Jvg6aAfDvBu1H36M0KJVpD2+gJ6qEQHaAj9BqdoAli6Bp9Rl/Q19Z3b93reFurUq910/MY/RXe9k8Oqrk4</latexit>Lr = R 2π
n
X
i=1
cos−1(li · li+1) li ⇥ li+1 kli ⇥ li+1k
<latexit sha1_base64="mnZwKcjMwFPBAkOHUka0pds4Fc=">ACpHicbVFb9MwGHUyLqPA1jHeLGoQENsTdIWVh4mJvGCRB/Gpdukuo0cx9ms2U5mO9UqL/xP3vkB/ASctFy1T7J0fM53/NnHScGZNmH4zfPXbt2+c3f9Xuv+g4cbm+2tR8c6LxWhY5LzXJ0mWFPOJB0bZjg9LRTFIuH0JLl4V+snc6o0y+UXsyjoVOAzyTJGsHFU3P46ihU8gChTmNhPle2hglVIlyK27CqZhIikuZ3YuqHTnMXP7NDewxpa9jKoXEO2u7CvdMEH1n4bKoubFXRdxe1O2B1Gr8L9PlyCwZsVeN2HUTdsqvP2B2jqKN7yNlCak1JQaQjHWk+isDC7GaeXcmqxMoxwWrVQqWmByQU+oxMHJXaDp7aJq4LPHJPCLFduSQMb9m+HxULrhUhcp8DmXP+v1eRN2qQ02XBqmSxKQyVZDspKDk0O6+xhyhQlhi8cwEQxd1dIzrGLzrgfaqHGaIOxdrtAKxGMWKwWgSGXoksYJLwMqWBm6vY1d7cHeVe0yQ46PWGgzrBGvSjX2D4O8HjXjfqd8OPg87h2WUYB08AU/BDojAPjgE78ERGAMCvnstb9t7D/3R/5nf7xs9b2VZxv8U/7sJ46u0Tk=</latexit>Specular shading, polygonal lights
Now the integral (for unit source radiance) reads and analytic solutions are only available for special forms of the BRDF
- Phong BRDF:
solution due to Arvo via a generalization of Lambert’s formula
- Other BRDFs: approximate the function by some convenient function
- Clever idea due to Heitz: linearly transformed cosine function:
Lr(v) = Z
Ω(S)
fr(v, l) (n · l) dl
<latexit sha1_base64="FEpCGka8LG0GNewNpSZ3sZ546i8=">ACZ3icbVDdihMxGE3Hv7XqbldBG+iRWihdmba6tYLcUbwQVXtLsLTRkymW+6YZPMmGTKlqHP49N4q/gI3vkIZmZWUfGDkJNzvp98J84FNzYIvrW8S5evXL2db194+at7Z3O7u0jkxWawYxlItMnMTUguIKZ5VbASa6ByljAcXz2qtKPV6ANz9QHu85hIelS8ZQzah0VdV4eRLpHVqs+fo4JVzYqyVsJS9p739/gtNEGmKxEnwcVpiwJLM1gckgcXfU6QbDafgk2BvjBkyeXYCnYxwOgzq6L36gOg6j3dY2STJWSFCWCWrMPAxyO0gFfFSLkmrLmYBNmxQGcsrO6BLmDioqwSzKeuMNfuSYBKeZdkdZXLN/VpRUGrOWscuU1J6af7WK/J82L2w6XZRc5YUFxZpBaSGwzXBlH064BmbF2gHKNHd/xeyUasqsM7lN6sLSnxn38o2W/gGPNdVr38K5TH2umCgS8N1czc8fr1wrt03t4GQ0mk4qByswDn+B6W8Hj0bDcDwM3k26+28aK9EWuo8eoh4K0R7aR6/RIZohj6hz+gL+tr67u14d717TarXuqi5g/4K78FP4L6YA=</latexit>fr(v, l) ∝ (r · l)n
<latexit sha1_base64="PjepGxitSPyZKjvVdjExvkQDYUQ=">ACTXicbVBNb9NAEB2nQEuA0pZjLysiRJFKbCeBhlMrISEOHIpE2kpxiNbrcbvqfpjdtdXI6k/g13CF38CZf8GFG0KsnYIAMdJKb9+b2dn30kJw6LoS9BZuXb9xuraze6t23fW725sbh1ZXRqGE6aFNicptSi4wonjTuBJYZDKVOBxev680Y8rNJZr9cYtCpxJeqp4zhl1npvPMznZiepql2SVOIRSQqjC6eJpwxJWKZdy7/1nb2oP46fRHtDsgSjZ1fg6ZDE/ait3v5XaOtwvhmsJ5lmpUTlmKDWTuOocLu5wHdqVlPjOBN42U1KiwVl5/QUpx4qKtHO6tbXJXngmYzk2vijHGnZPydqKq1dyNR3SurO7L9aQ/5Pm5YuH89qrorSoWLRXkpiHfehEQybpA5sfCAMsP9Xwk7o4Yy56PsJu1gHU6sv4XWyPAVTw01i9DhcxDrpgoMwz9XsMvHlf+Ke+mTXA0GIxHTYINGMa/wPh3gkeDfjzsR69HvYMXyhDbhPuxADHtwAC/hECbA4D18gI/wKfgcfAu+Bz+WrZ3gauYe/FWd1Z/CY7RY</latexit>fr(v, l)
<latexit sha1_base64="TsjAxMJMrTyGLsEJW3pfsN5VrZI=">ACMXicbVDLbtQwFL1p6YMpfS/ZWIyQitROkpmBTldUQkIsWBSp01aRCPHczO1ajup7UQdRf0OtvANfE13iC0bPgEnUypAvZKl43Pu8b0+S64sUFw5y0sPlaXl92lp7tr6xubW9c2ayQjMcskxk+iKhBgVXOLTcCrzINVKZCDxPrt7V+nmJ2vBMndpZjrGkU8VTzqh1VJyO9V5UlvskKsWr8VY76AzC18Fhj8xB/+gevOmRsBM01X7C5o6GW97G9EkY4VEZmgxozCILf7qcBrFVdUW84E3raiwmBO2RWd4shBRSWauGp2vyUvHTMhabdUZY07N+OikpjZjJxnZLaS/O/VpOPaPCpoO4iovLCo2H5QWgtiM1EGQCdfIrJg5QJnmblfCLqmzLq4WlFjrPyhcTfaOl/5ImeuZbvJGpzxUTxQR9N1fzm4PSPeV+0yTY73YH/TrBGvTCP2DwkOBZtxP2OsGnfv4/TxKWIXn8AL2IRDOIYPcAJDYHANn+ELfPW+eXfed+/HvHXBu/fswj/l/fwNiNSq/Q=</latexit>g(l)
<latexit sha1_base64="NIaNkXowvgmkLOD9ZFIFM7fh9QY=">ACKnicbVDLThsxFL0DtNDQ8uqyG4sIiUqQmUkChBVISKgLFiA1ASmJkMe5Ewy2Z7A9EdGIf+iWfkO/h1iywfwCfVMaFVQr2Tp+Jx7fK9PlApubBA8eFPTM+/ez859qMx/LSwuLS80jFJphm2WSISfRZRg4IrbFtuBZ6lGqmMBJ5GVweFfjpCbXivtxin1Jh4rHnFHrqM5wvTcSX8+XqkGtFW4FOw0yAc3dF7DdIGEtKu69wxlHZ8vewu9QcIyicoyQY3phkFqN2KB16qfU205E3hb6WUGU8qu6BC7Dioq0fTzculbsuaYAYkT7Y6ypGT/deRUGjOWkeuU1F6Yt1pB/k/rZjZu9XOu0syiYpNBcSaITUiRABlwjcyKsQOUae52JeyCasqsy6nSK4253zbu5hst/SMearHvsUbGftcMZEN0HdzNb/ZHLmn3G/KBJv1eqtZJFiARvgHtP4m2KnXwkYtOGlW9w8nUcIcfIFVWIcQdmAfvsExtIHBJfyAO/jp/fLuvQfvcdI65b14PsOr8p5+Azx+qFM=</latexit>g(l) ∝ (M−1l) · n
<latexit sha1_base64="HBl5J1d6jqBm4WGWpOvSZYEuLA=">ACTXicbZDNbtNAEMfXKdASoJ/HXlZEiCDR2E7SNj21EpdKgFQk0laKQ7Vej9NV98PdXUeNrDxCn4YrPAPnvkUvSHE2i4IECOt9Nv/zOzs/OM2OD4MZrLDx4+Ghx6XHzydNnyura+vHRuWawpAqrvRpTAxwJmFomeVwmkgIuZwEl+8KfMnU9CGKfnRzjIYCzKRLGWUWCedrb6ctKMpf4WjTKvMKtyOxPtPxVY4x7VME2UduspW0BmE28FuD9fQ37uHnR4O0EVrf1bVMXR2Zq3HCWK5gKkpZwYMwqDzL5OVzKcUG0ZTDvBnlBjJCL8gERg4lEWDGRbXHL9wSoJTpd2RFlfqnx0FEcbMROwqBbHn5t9cKf4vN8ptOhgXTGa5BUnrQWnOsTOgNAknTAO1fOaAUM3cXzE9J5pQ6xsRlVj4Q+Nu/lGC/8dizXRM9/ClUh9JinPE/DdXM2utqbuKbdN5WC/2x30SwdL6IW/YPDbweNuJ+x1g/91sHb2kq0hDbRc9RGIdpFB+gQHaEhougafUZf0Ffvm3fnfd+1KUN75nA/0VjcWfPGW0Ew=</latexit>Linearly transformed cosines
See Heitz’s slides, video, and WebGL demo
- https://eheitzresearch.wordpress.com/415-2/
Real-time environment illumination
Now incident radiance field is stored in a texture, not defined by a polygon
- this makes it easy to do mirror reflections: single cubemap lookup
Two special kinds of BRDFs are convenient
- diffuse BRDFs: irradiance depends only on surface normal (not v)
…leads to irradiance environment maps
- rotationally symmetric lobes (e.g. Phong): it’s a convolution of the environment map
…leads to prefiltered environment maps
Standard reflection map
For mirror-specular surface, the illumination integral reduces to This is a function only of r
- so store it in a cubemap and look up using r(v, n).
Lr(v) = Li(r(v, n))
<latexit sha1_base64="lzHQhec/0+3wgVOSm7sGDJyI+ec=">ACQ3icbZDPahRBEMZrEv/EVeMmOYrQuAhZiDszu2uyOYgBL4J7iOAmgZ1l6OmtSZp094zdPUOWIac8jVd9Bh/CZ/Ai4lWwZzaKigUNv/q6vrS3LBjQ2Cz97K6o2bt26v3WndvXd/UF7Y/PIZIVmOGZyPRJQg0KrnBiuRV4kmukMhF4nJy/rOvHJWrDM/XWLnKcSXqeMoZtU6K24/Gsd6OyrJLnpNxzB026Q6JStXtxu1O0BuFz4K9AVnCcP8adgck7AVNdF58hSYO4w1vPZpnrJCoLBPUmGkY5HYnFfhOzSqLWcCL1tRYTCn7Jye4tShohLNrGq2uSRPnDInabdUZY06p8dFZXGLGTibkpqz8y/tVr8X21a2HQ0q7jKC4uKLQelhSA2I7U1ZM41MisWDijT3P2VsDOqKbPOwFbUNFb+xLjMN1r6Y5oqhe+xQuZ+lwxUczRd3M1v3hauqfcNo2Dw35/NKwdrGEQ/oLRbweP+r1w0AveDsHr5dWwho8hMewDSHswQG8gkOYAIMreA8f4KP3yfvifO+L6+ueNc9W/BXeD9+Au1BsHo=</latexit>Irradiance environment map
For diffuse surface, illumination integral reduces to This is a function only of n
- so store it in a cubemap and look up using n.
Lr = R π Z
Ω
Li(l) (n · l) dl
<latexit sha1_base64="IaqHgxQwXRGt6294Fawpmh2WdCM=">ACZnicbVBdb9MwFHUzPrYCpRuaeODFokIa0miStrDuAVGJFyQqMRDdJtV5Dg3nTXbCbZTrYr6d/ZreAWJf8AjPwEnLQgQV7Lu8bn3+PqeOBfc2CD41vC2bty8dXt7p3n7r3W/fbu3qnJCs1gwjKR6fOYGhBcwcRyK+A810BlLOAsvnxd1c8WoA3P1Ee7zGEm6VzxlDNqHRW1R+NI45eYpJqy8sOqJDlfYcKVjcg7CXOKxE/IAvxFJNDlxVhSWbxhkhcjtqdoDsMnwdHfbwGg+MNeNHYTeo/PqB6rjJNptEiSsUKCskxQY6ZhkNvDVMAnNSuptpwJWDVJYSCn7JLOYeqgohLMrKwXuEnjklwml3lMU1+6eipNKYpYxdp6T2wvxbq8j/1aFTYezkqu8sKDYelBaCGwzXLmHE6BWbF0gDLN3V8xu6DO+s8bpJaWPoT426+0dIf81hTvfQtXMnU54qJIgHfzdX86tnCPeW2qR0c9HrDQeVgBfrhLzD87eBprxv2u8H7QWf0dm0l2kaP0GN0gEJ0hEboDTpBE8TQNfqMvqCvje9ey9v3Hq5bvcZG8wD9FR7+Cex5uvk=</latexit>Irradiance environment map
environment map irradiance map
Gary King in GPU Gems 2 http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter10.html
Irradiance map illumination
McGuire et al. HPG ’11 10.1145/2018323.2018327
Irradiance map illumination
McGuire et al. HPG ’11 10.1145/2018323.2018327
Prefiltered environment map
For a general specular surface, approximate the BRDF by a function
- where g defines a lobe of width σ that is symmetric around r
The illumination integral is This depends only on r and the scalar σ
- so store it in an array of cubemaps indexed by σ, and look up using r
fr(v, l) (n · l) ≈ gσ(l · r)
<latexit sha1_base64="qHRkES0l4m/bzqAshvDx3MfcZjw=">ACZXicbVDLbtNAFJ2YVwm0pFCxYcGICKmV0thOAk1XrcQGCRZFIm2lOLG4+t01HmYmbGVyOrn9GvYlgVfwJZPYOykCBXGunc+5j7klyzowNgu8t787de/cfbDxsP3q8ufWks/301KhCU5hQxZU+T4gBziRMLMcznMNRCQczpLd7V+VoI2TMnPdpnDTJC5ZBmjxDoq7hxlsd6NyrKHo5Lv4aiHXSYjmiq7Zkiea7XA8zgybC6Ikzm+1fVe3OkG/XH4JjgY4hUYHa7B2yEO+0ET3aOfqImTeLu1FaWKFgKkpZwYMw2D3PYyDl/krCLaMsrhqh0VBnJCL8kcpg5KIsDMqubeK/zaMSnOlHZPWtywf3ZURBizFImrFMRemH+1mvyfNi1sNp5VTOaFBUlXi7KCY6twbR5OmQZq+dIBQjVzf8X0gmhCrbO4HTWNlT8xLvONFv5Hlmil76Fhch8JikvUvDdXs0W+6Ub5a5pHBwNBuNR7WANhuEtGP928HTQD4f94NOoe/xhZSXaQC/QK7SLQnSAjtF7dImiKJr9BXdoG+tH96mt+M9X5V6rXPM/RXeC9/Aaisumo=</latexit>Lr(v) ≈ Z
Ω
gσ(l · r) Li(l) dl
<latexit sha1_base64="lIC2K78XcxySqv6DyL9lSW0PkUI=">ACbHicbVDtahQxFM1O/air1q36rwjBRanQ7szsbu36y4IgtWcNvCZhkymTvT0CQzJplhl6Fv5NP4T/QZxEcwM1tFxQshJ+e2/uiQvBjQ2CLx1v49r1Gzc3b3Vv37m7da+3f/E5KVmMGO5yPVZTA0IrmBmuRVwVmigMhZwGl+8avKnFWjDc/XBrgpYSJopnJGraOi3utpHdJVT3DhBaFzpeYcGUj8k5CRnEWEcMzSZ1CYMKS3GJSafdm0a8IRuYuDvq9YPBJDwIDkd4DcYvrsDzEQ4HQRv9lz9QG8fRdmeLJDkrJSjLBDVmHgaF3UsFfFSLmrLmYDLikNFJRd0AzmDioqwSzqdu1L/MQxCU5z7Y6yuGX/rKipNGYlY6eU1J6bf3MN+b/cvLTpZFzVZQWFsPSkuBbY4bD3HCNTArVg5Qprn7K2bnVFNmndNd0hbW/sy4l2+09Kc81lSvfAtLmfpcMVEm4Lu5mi/3K9fKbdM6OB4OJ+PGwQaMwl9g8tvBk+EgHA2C9+P+0du1lWgT7aDHaBeF6BAdoTfoGM0Q5/QZ/QVfet89x56O96jtdTrXNU8QH+F9/QnEzy9Tw=</latexit>Irradiance environment mapping
Akenine-Möller et al. RTR 3e
prefiltered map for glossy surface environment map for specular surface prefiltered map for diffuse surface
Prefiltered environment map
environment map prefiltered for Phong
Gary King in GPU Gems 2 http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter10.html
blitzcode.net
Prefiltered map variants
Many approaches to approximating the BRDF with symmetric lobes
- classic is to use a single lobe, loses stretching at grazing angles
- many techniques use multiple samples, similar to anisotropic texture filtering
- modern thought process is to treat the whole precomputation as approximating more accurate
BRDF lobes using multiple samples from arbitrary maps stored in mipmaps
Manson & Sloan 2016