[video output=day401 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Debugging Lighting Transfer" vod_platform=youtube id=iqVzS326DsA annotator=Miblo] [0:07][Recap and set the stage for the day] [1:14][Run the game to see how the lighting is looking at the moment] [7:39][Note some oddities in the lighting solution] [10:14][handmade_render_group.cpp: Prevent the ambient occlusion code from running and run the game to still see the bright flashes] [11:50][handmade_config.h: Only do one pass of the lighting solution, and run the game to see that this is relatively stable] [13:14][handmade_config.h: Add Global_Renderer_Occlusion_IterationCount for LightingTest() to use] [13:43][Run the game doing two ambient occlusion passes] [14:44][handmade_config.h: Switch to the game view, with two ambient occlusion passes, and run the game to see how that looks] [18:01][handmade_config.h: Increase the number of lighting iteration passes and run the game with the determination to investigate the flashes] [20:35][Launch Milton and try out the tablet tracking] [22:58][Blackboard: Light Conservation] [28:45][Blackboard: Converging on a good lighting solution] [30:00][handmade_render_group.cpp: Consider making emission a first-pass-only process] [32:40][Blackboard: Occluded Reflectors, and Total Emittance] [37:37][The difficulty of parallelised summation] [39:48][Blackboard: Radiosity, and stabilising the contribution of light by multiple proximate reflectors, with a recommendation to read literature on the problem] [43:37][Blackboard: Considering how to handle over-contribution of light distribution] [48:04][handmade_render_group.cpp: Organise lighting_element to aid our conceptualisation of the light conservation problem] [53:18][Hit an error in OpenGLDebugCallback()] [54:30][Blackboard: All light must go somewhere] [55:33][handmade_render_group.cpp: Enable LightingTest() to make RefC converge towards 0, and track the transference and accumulation of light] [1:03:25][handmade_render_group.cpp: Enable LightingTest() to correct for the wrongness of the transfer] [1:11:10][Step through LightingTest()] [1:13:10][Consider how to handle emission] [1:13:46][handmade_render_group.cpp: Prevent LightingTest() from performing the correction and just letting the light bounce ad infinitum] [1:14:27][Run the game to see the flickery results] [1:14:56][handmade_render_group.cpp: Let LightingTest() perform the correction again, and run the game to see the flickering still] [1:15:36][Consider how to handle the total light transfer] [1:17:35][handmade_render_group.cpp: Add PhotonsToSend and PhotosReceived to lighting_element, for LightingTest() to use] [1:22:14][handmade_render_group.cpp: Enable LightingTest() to draw the photons] [1:23:31][Run the game to see the photons transference] [1:24:08][handmade_render_group.cpp: Assert in LightingTest() that PhotonsToSend <= TotalPhotonCount, run the game, hit that assertion and investigate why] [1:26:43][handmade_render_group.cpp: Make LightingTest() actually multiply in the correction] [1:27:14][Run the game in release, and see that it is more correct but that the flickering is still there] [1:30:36][Run the game on a loop and change the lighting iteration count to see how that affects it] [1:32:40][handmade_world_mode.cpp: Prevent AddPlayer() from adding any body parts and hit points] [1:34:06][Run the game and move just the light, to determine that the hero himself was causing the flickering problem] [1:36:39][handmade_render_group.cpp: Make LightingTest() strictly sum the FrontEmitC, and run the game without flickering, noting that the occluders are spaced far apart] [1:39:31][Determine to fix the distance falloff for close objects] [1:40:11][handmade_render_group.cpp: Let LightingTest() temper the FrontEmitC by the number of lighting iterations] [1:41:42][handmade_render_group.cpp: Remove PhotonsToSend and PhotonsReceived from lighting_element] [1:42:34][Run the game to see the stable light] [1:42:44][handmade_world_mode.cpp: Let AddPlayer() add body parts, and run the game noting that these body parts are very bright] [1:44:28][handmade_render_group.cpp: Fix the DistanceFalloff computation in LightingTest()] [1:44:44][Blackboard: Distance Falloff] [1:48:25][Run the game to see that the flickering has gone] [1:49:27][handmade_world_mode.cpp: Make AddStandardRoom() draw the walls in red] [1:51:18][Run the game to see if we get red light bleeding from the walls] [1:51:53][handmade_config.h: Perform two ambient occlusion passes and run the game] [1:54:34][Q&A][:speech] [1:54:47][@macielda][Is it supposed to be Square(...) and not SquareRoot(...)?] [1:56:15][handmade_render_group.cpp: Make LightingTest() prevent the DistanceFalloff from getting below 1] [1:56:44][Run the game to see how that looks] [1:57:58][@the_8th_mage][Now we don't need to do a global pass to normalize light?] [1:59:07][@macielda][Is it useful to convert the surface color from RGB to YUV in these equations, as in using Y to modulate light contribution somehow?] [2:00:55][@the_8th_mage][Do you know how much does a GPU gather cost compared to a load from a linear memory read?] [2:02:01][@the_8th_mage][I wrote GPU, not CPU] [2:02:37][handmade_config.h: Play with the lighting IterationCount and run] [2:03:17][@cubercaleb][Spectral lighting is something I never heard of before. Can you point out some good resources on the topic?[ref site="Matt Pharr and Greg Humphreys" page="Physically Based Rendering" url="http://pbrt.org/"]] [2:05:44][@the_8th_mage][In CPU it's much more efficient to read a cache line using _mm_load and not use the gather commands. Is the same true of the GPU?] [2:12:25][@the_8th_mage][Thanks, so you usually don't want to swizzle it yourself?] [2:15:59][@the_8th_mage][Is HMCon 3 still at the start of 2018?] [2:16:32][@Brian][ctray improvement: Would you be so kind as to give a suggestion of how you tackle saving the day? Do you prefer temp files (i.e. in %AppData%)? Just keep it simple like how you read settings.ctray. Should I look at how you save state like in ctime? I can try to tackle an alternative this week for I do need to become more confident in reading / writing to files] [2:18:04][@Brian][But that's what I did! I made it an ini file and rewrote that] [2:19:15][@macielda][Is it possible to mode-change monitor frequency nowadays (say from 75Hz to 60Hz) so I always try to get my game loop to run at 60Hz?] [2:22:07][@Brian][ctray question: As an exercise, I would like to investigate the cost of just bringing the overlays to the top and checking first if the overlays need to be brought forward. What should I look for? Should I profile the calls? Should I run it continuously to see if I get an error case? I realize this may not be the best thing to use as an example, but it was something I struggled with] [2:24:35][Close that][:speech] [/video]