[video output=day569 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Raycasting from Light Probe Locations" vod_platform=youtube id=rE3RPBA7UvI annotator=Miblo] [0:02][Recap and set the stage for the day][:speech] [0:44][Demo the current state of our test ray casting from voxel centres, with the determination to cast rays from light probe locations][:lighting :run] [4:28][Prepare to switch over to raycasting from light probe locations][:lighting :research] [7:32][Introduce Frumbledygok() to contain the voxel-centre casting code from EndLightingComputation()][:lighting] [8:47][Begin to develop the light probe-based ray casting][:lighting] [11:33][A few words on programmable light falloff vs real life inverse-square falloff][:lighting :speech] [14:07][Continue to develop the light probe-based ray casting, introducing TestCastFromProbes()][:lighting] [20:58][Introduce GetVoxelIndex() to find which voxel a point in world space corresponds to][:lighting] [25:38][Introduce GetVoxelCenterP()][:lighting] [27:34][Make TestCastFromProbes() call our new GetVoxelIndex() and GetVoxelCenterP()][:lighting] [29:28][Check out our initial light probe-based ray cast :lighting][:run] [30:46][Toggle on IsTestCast in TestCastFromProbes()][:"debug visualisation" :lighting] [31:37][See unexpected rays][:"debug visualisation" :run] [32:16][Disable :lighting in CompileZBiasProgram()] [32:28][Check out our rays in a shadowless world][:"debug visualisation" :lighting :run] [33:00][Fix the HitP computation in TestCastFromProbes()][:lighting] [33:36][Check out our correct rays in a shadowless world][:"debug visualisation" :lighting :run] [34:44][Consider working on our voxel fill][:lighting :research] [36:50][Introduce PushDebugBox() for RayCast() to call][:"debug visualisation" :lighting] [39:00][Make TestCastFromProbes() draw the voxels hit by the rays][:"debug visualisation" :lighting] [41:38][Check out our hit voxels, finding that we seem to overflow our DebugLines in lighting_solution][:"debug visualisation" :lighting :programming :run] [43:19][The [@Molly puss] arrives][:speech] [43:59][Hit our assertion in PushDebugLine() and investigate why][:"debug visualisation" :lighting :run] [45:39][Increase the DebugLines array in lighting_solution from 4096 to 65536][:"data structure"] [46:04][Check out our supposed 4096 lines][:"debug visualisation" :lighting :run] [47:14][Step through TestCastFromProbes() to see multiple light probes set identically][:"debug visualisation" :lighting :run] [48:45][Replace the SetLightProbePosition() call in UpdateAndRenderEntities() with a newly introduced PushLightProbe(), to prevent multiple light probes in the same location][:lighting] [51:06][Check out our hit voxels][:"debug visualisation" :lighting :run] [52:26][Shrink the voxel :"debug visualisation" in TestCastFromProbes()][:lighting] [53:01][Check out our hit voxels, and determine to fill a swathe of nine voxels][:"debug visualisation" :lighting :run] [54:35][@Molly][Meow] [56:41][Introduce SpamVoxel() to flood our light computation into blocks of nine voxels, and a utility InLargeVoxel()][:lighting] [1:03:17][Check out our flood filled voxels][:"debug visualisation" :lighting :run] [1:03:37][Prevent CompileZBiasProgram() from disabling the :lighting] [1:04:05][Check out our beautiful :lighting][:run] [1:04:52][Make UpdateAndRenderEntities() position our light source nearer the ground][:lighting] [1:05:20][Find that our light source still lights the area beyond a wall][:lighting :run] [1:05:55][Disable :lighting in CompileZBiasProgram()] [1:06:11][Note that our flood filling does not propagate through the wall at the starting location][:lighting :run] [1:06:49][Prevent CompileZBiasProgram() from disabling the :lighting] [1:07:14][Increase the radius of our test casting :"debug visualisation" in TestCastFromProbes()][:lighting] [1:08:02][See our flood filling propagate through that wall at the starting location][:lighting :run] [1:08:14][Only make TestCastFromProbes() perform the flood fill if our ray did not hit][:lighting] [1:08:36][Find that we light slightly erroneously, because we aren't clearing voxels][:lighting :run] [1:09:24][Decrease the radius of our test casting :"debug visualisation" in TestCastFromProbes()][:lighting] [1:09:45][Make TestCastFromProbes() clear the voxels each frame][:lighting] [1:11:02][Check out our :lighting][:run] [1:11:45][Make UpdateAndRenderEntities() position our light source still nearer the ground][:lighting] [1:12:33][Admire our fog-of-war :lighting][:run] [1:12:49][Decrease the light falloff time (thus increasing our light radius) in SpamVoxel()][:lighting] [1:13:12][Admire our more farsighted fog-of-war :lighting][:run] [1:13:41][Disable IsTestCast in TestCastFromProbes()][:lighting] [1:14:05][Admire our fog-of-war :lighting without voxel :"debug visualisation"][:run] [1:15:04][Make UpdateAndRenderWorld() position the light source relative to GroundP][:lighting] [1:15:34][Admire our more stable light, with the determination to handle blending and convection][:lighting :run] [1:18:15][Q&A][:speech] [1:19:22][@sahfortv][Q: Isn't there an hour left?] [1:19:53][@sneakybob_wot][Q: would the :"particle system" you had (heads popping out) be affected by the shadows at the moment?] [1:20:09][Check out the :lighting on the particles][:run] [1:22:17][Disable Global_Lighting_ShowProbes][:lighting] [1:22:25][Check out our cleanly lit world][:lighting :run] [1:23:44][@vaualbus][Q: Can we enable light for the debug interface so we see the impact of the code?][:lighting :"debug system"] [1:24:10][@tootac][Q: Are you procrastinating on doing gameplay code and inventing problems to solve? Last time I checked (\~3 months ago) you were saying you are about to start gameplay code in a couple of streams] [1:24:56][Admire our :lighting][:run] [1:25:39][@polijn][Just give the game code as an assignment to [@naysayer88 Jon]. Last I heard he had time to spare] [1:25:54][@ankut][Q: Why are the debug lines a fixed sized buffer? Just 'cause it's throwaway code?][:memory] [1:26:43][@dithinas][Q: Do you have any thoughts on the trade-offs of making your data structures directly serializable versus having intermediate serialize / deserialize steps, i.e. data structures containing pointers being converted to offsets or indices][:"data structure"] [1:28:17][@0lpbm][Q: Are the bounces going to be computed also with the raytracer?][:lighting] [1:29:19][Increase tCloseEnough in RayCast()][:lighting] [1:29:42][Determine the tCloseEnough filtering to be garbage][:lighting :run] [1:30:33][@vaualbus][Q: Can we add for a test a second bounce or it require more work?][:lighting] [1:31:18][Temporarily make TestCastFromProbes() bounce our rays once][:lighting] [1:34:50][Check out our hacked secondary bouncing of the ray cast :lighting][:run] [1:36:16][Delete the secondary bounce code from TestCastFromProbes()][:lighting] [1:36:43][Check we didn't screw anything up there][:lighting :run] [1:37:04][@stevenlr][Q: Do you plan on adding details on how sprites are lit? Right now they are full dark when the light is behind it. Maybe normal maps or some subsurface transport? Although I guess bounces will help with that anyway][:lighting] [1:37:45][@qiaoster][Q: It's my second year programming and it feels like there's endless stuff to catch up before I can be a competent games programmer. What might I do to help with that?] [1:39:12][@vaualbus][Q: It should be SecCast not Cast?][:lighting] [1:39:21][Reintroduce and fix the secondary bounce code in TestCastFromProbes()][:lighting] [1:39:45][Check out our hacked secondary bouncing of the ray cast :lighting][:run] [1:41:01][Make SpamVoxel() take the LightP and LightC for secondary bounces to compute specially, dimming the light][:lighting] [1:43:42][Check out our dimmed secondary bouncing of the ray cast :lighting][:run] [1:44:41][@nickito97][Q: How are you going to handle bouncing off of different materials?][:lighting] [1:45:29][@timetravel1][Q: Which type of engine programming do you think the industry needs the most? Does it need more graphics programmers, or physics, or sound programmers for example?] [1:47:43][@timetravel1][So the answer is "everything everywhere yes"] [1:48:22][@iof_bastion][Q: Are engine programmers really as in-demand as you say? I see that most AAA games are releasing with hundreds of employees but only like 4–6 engine programmers] [1:49:58][@qiaoster][Q: How much do game studios hire interns? Trying to find something for next year] [1:50:44][@binarytoshokan][Q: Following with the theme, what would you define as the minimum requirements to be a good engine programmer?] [1:53:57][@an0nymal][Q: Why aren't most studios willing to compensate appropriately in spite of the seemingly short supply of graphics programmers?] [1:54:57][@centhusiast][Q: Have you heard about Valve's ACO Mesa shader compiler for AMD GPU? Apparently it is replacing LLVM and it is a great thing for Linux gaming] [1:55:24][@an0nymal][Q: Relative to other positions on the team that may not require as extensive knowledge] [1:57:23][@centhusiast][Q: Have you heard about Valve's ACO Mesa shader compiler for AMD GPU? Apparently it is replacing LLVM and it is a great thing for Linux gaming] [1:58:17][@an0nymal][Q: Well, as a specific example, take Bethesda: They pay gameplay programmers 80–110k, but the graphics / engine programmer is 90–130k. Obviously, those numbers are from pay scale, glass door, etc, but most likely represent a decent sample size] [2:01:28][Wrap it up][:speech] [/video]