[video output=day565 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Reconstructing Multiple Lights" vod_platform=youtube id=PinOVuuBSnM annotator=Miblo]
[0:01][Recap yesterday's discovery using a signed distance field for :lighting falloff][:speech]
[2:42][Demo our voxel-based signed distance field interpolated :lighting, non-computed][:run]
[4:04][Make EndLightingComputation() encode the light as 0 to 1 values][:lighting]
[4:28][Watch the falloff interpolation artifact return][:lighting :run]
[5:00][Reinstate the signed distance field in EndLightingComputation() and watch the falloff smooth out][:lighting :programming :run]
[7:39][Reorganise and enable our voxel checkerboard code in EndLightingComputation()][:"debug visualisation" :lighting]
[14:04][Check out the resolution of our voxel grid][:"debug visualisation" :lighting :run]
[15:07][Halve our voxel resolution][:lighting]
[15:15][Check out our lower resolution voxel grid][:"debug visualisation" :lighting :run]
[15:23][Toggle off our checkerboard in EndLightingComputation()][:"debug visualisation" :lighting]
[15:53][Admire the quality of our :lighting reconstruction][:lighting :run]
[16:46][Disable trilinear filtering][:lighting]
[17:16][Check out the sparse resolution of our light][:lighting :run]
[18:03][Toggle on our checkerboard in EndLightingComputation()][:"debug visualisation" :lighting]
[18:27][Consider our voxel resolution to suffice][:"debug visualisation" :lighting :run]
[18:59][Enable trilinear filtering and embark on switching our light :sampling from the box-model, to a signed distance field scheme][:lighting]
[20:29][Consider encoding our light field using spherical harmonics[ref
    site=ResearchGate
    page="Figure 2. 3-D shape of Spherical Harmonic basis functions"
    url=https://researchgate.net/figure/3-D-shape-of-Spherical-Harmonic-basic-functions_fig2_224165074][ref
        site=Wikipedia
        page="Spherical harmonics"
        url=https://en.wikipedia.org/wiki/Spherical_harmonics][ref
            author="Peter-Pike Sloan"
            title="Stupid Spherical Harmonics (SH) Tricks"
            publisher="Microsoft Corporation"
            url=https://ppsloan.org/publications/StupidSH36.pdf]][:lighting :research]
[38:07][Change our light :sampling to a signed distance field, normal plus colour scheme in CompileZBiasProgram()[ref
    site=docs.GL
    page="glTexImage2D"
    url=http://docs.gl/gl3/glTexImage2D][ref
    site="Khronos"
    page="glext.h"
    url=https://www.khronos.org/registry/OpenGL/api/GL/glext.h][ref
    site="Khronos"
    page="EXT_packed_float"
    url=https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_packed_float.txt]][:lighting]
[1:00:51][Update EndLightingComputation() to handle our separately encoded normal and colour][:lighting]
[1:06:05][Update CompileZBiasProgram() to handle our separately encoded normal and colour][:lighting]
[1:08:10][Find that that worked the first time, but the normals are not correct][:lighting :run]
[1:08:59][Enable GetIrradiance() in CompileZBiasProgram() to produce and EndLightingComputation() to encode a -1 to 1 normal, introducing BinormalToNormal()][:lighting]
[1:12:33][Find that our normal encoding now works correctly][:lighting :run]
[1:13:04][Add a secondary light source in EndLightingComputation()][:lighting]
[1:15:42][See our two light sources][:lighting :run]
[1:15:54][Further separate our two light sources][:lighting]
[1:16:21][See our two separated light sources][:lighting :run]
[1:16:27][Colour our light sources yellow and cyan][:lighting]
[1:16:38][See our two separate coloured light][:lighting :run]
[1:16:49][Overlap our two lights][:lighting]
[1:16:57][Check out the intersection of our lights][:lighting :run]
[1:19:29][Nsight rendering time: 6ms / frame][:lighting :run]
[1:20:41][Add two more light sources in EndLightingComputation()][:lighting]
[1:22:57][See three of our four lights][:lighting :run]
[1:23:16][Enable CompileZBiasProgram() to sample our fourth light][:lighting :sampling]
[1:24:32][See our four lights][:lighting :run]
[1:25:32][Consider how to change our light probes to work as a signed distance field][:lighting :research]
[1:31:56][Admire our :lighting, and consider tracking colour and intensity differently][:run]
[1:33:52][Q&A][:speech]
[1:34:14][@invertedgold][Q: Have you taken anything you implemented for [~hero Handmade Hero] and used it in your other work?]
[1:35:23][@eddiesutrecht][Q: What are you working on during the week?[ref
    site=1935
    url=https://molly1935.com/][ref
    site="Meow the Infinite"
    url=https://meowtheinfinite.com/][ref
    site="Molly Rocket"
    url=https://mollyrocket.com/]]
[1:36:43][@rooctag][Q: How will walls stop light, same bouncing rays as before?][:lighting]
[1:37:55][@eddiesutrecht][Q: I assume there is a source of income, not working on projects for pay?]
[1:40:22][@eddiesutrecht][Q: You do realise you could be a very wealthy man if you accept a small project for a few weeks, right?]
[1:51:10][@tomisqi][Q: In terms of programming techniques, how has your style changed over the course of this project? Are there things you did at the beginning of this project that you think were steps in the wrong direction or would do differently?][:language]
[1:55:14][@centhusiast][Q: Can :memory fragmentation happen on GPU?]
[1:59:30][@filiadelski][Q: 10/10 pants, looks very comfy]
[1:59:33][@timetravel1][Q: How would you compare WinDBG and ~RemedyBG? Should I consider switching to ~RemedyBG if I'm using WinDBG?]
[2:03:01][@vtlmks][Q: Where could I learn more about out-of-order optimization?]
[2:03:14][@centhusiast][Q: Could you explained the stripped binary? Is it possible to optimize a binary even there is no access to the source code?]
[2:05:12][@ikojan][Q: Do you have any resources on why OOP programming isn't that good?][:language]
[2:05:58][@genos3][Q: What would be the best way to prevent overdraw in a software rasterizer, in particular with a voxel scene like Minecraft? (I asked this before but didn't specify the type of game)][:rendering]
[2:08:03][@devsigner][Q: I've heard you mention before that you don't like callbacks. Should they be avoided at all costs? How would you avoid them if using recursion and navigating a tree-like structure?][:language]
[2:08:55][@freddo669][Q: What’s your opinion on white board interviews in the big tech companies like Google?]
[2:12:01][@jessef][Q: If virtual :memory exists, how are games still able to be hacked? Is it because offsets are constant?]
[2:12:31][@centhusiast][Q: Have you heard about game development workshop assembly[ref
    site=Assembly
    url=https://www.assembly.org/] and also assembly archive?[ref
        site="Assembly Archive"
        url=https://archive.assembly.org/]There are lots of material there.]
[2:12:39][@culdevu][Q: Is there an errata page for the Jeff and Casey show that I can submit to?]
[2:12:47][@thehorse1sbrown][Q: How do you do design :memory arenas for multiple dynamic arrays to please the cache?]
[2:13:32][@sharlock93][Q: Don't you think that the reason for low quality software was because people wanted to do things faster?]
[2:13:53][@argor34][Q: I would like to express my deepest disappointment in the lack of new J&C episodes]
[2:14:15][@thehorse1sbrown][Q: I mean for software for simulations, something like Mathematica]
[2:14:26][@sharlock93][Q: Do you think it's possible to turn the web around? Also PJs are pretty nice]
[2:15:22][@montrealchrislee][Q: If you are an employer, which candidate would you choose? A: 4.0 GPA with no side project; B: 2.5 GPA with lots of side projects]
[2:19:21][@timetravel1][Q: Hey [@cmuratori Casey], I know you're busy and all. Can you stand up for me and reverse this linked list for me on the white board? Thanks]
[2:24:05][@sharlock93][Q: Random off-topic question but why does it feel like you would enjoy knitting? Just a random gut feeling]
[2:24:40][@printf_armin][Q: The thing is also that these people probably make the software slow and sh… on purpose to not be easily fired]
[2:26:44][@enemypanda][Q: What are some resources to learn graphics programming? How much math is really necessary?]
[2:27:41][@argor34][Q: If not with dynamic arrays, how do you store dynamically growing data when you can't predict how much :memory you will need and need to store it, so the [~hero Handmade Hero] temporary memory concept doesn't solve the problem? I figure some sort of linked list is even worse for the cache]
[2:28:00][@devsigner][Q: Have you or would you ever use goto?][:language]
[2:30:33][@uplinkcoder][Q: switches can in some cases generate indirect jumps][:language]
[2:31:35][@catccherguy14][Q: Will you be an early adopter of JAI?][:language]
[2:31:40][@pookyo_o][Q: In your experience what do you think are good ways to manage software projects? I hear lots of praise for scrum / agile but from my experience these methodologies have shown none to little results. Am I missing something with these methodologies?]
[2:31:53][@argor34][Q: The dynamic array example: 1) a list of active connections on a server; 2) an array of entities in a game][:memory]
[2:32:34][@thehorse1sbrown][Q: If you have several unpredictably growing dynamic arrays, say in a "math" simulation, would you separate them by a large distance in a :memory arena? Or do you pile blocks on top of each other? What does the cache prefer? Is it even a concern?]
[2:34:41][Close it down, people][:speech]
[/video]
