[video output=day561 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Sampling Light Voxels with a Reflection Vector" vod_platform=youtube id=6m3xD5Gm9DA annotator=Miblo]
[0:01][Recap and set the stage for the day][:speech]
[0:34][Demo our tartan world with a view to :sampling all of our voxels][:lighting :run]
[2:19][Consider optimising CompileZBiasProgram() to only sample from three voxels][:lighting :research]
[3:36][Toggle off BuildSpatialPartitionForLighting() and ComputeLightPropagation() in EndLightingComputation()][:lighting]
[4:08][Nsight :rendering time: 22ms / frame][:lighting :run]
[5:00][Capture a frame to see that the glTexSubImage3D() call takes most of our frame time, at 15.13ms][:lighting :rendering :run]
[8:43][Make OpenGLInit() rather than OpenGLEndFrame() set the texture parameters for each voxel][:lighting]
[9:39][Ensure that that has done nothing adverse][:lighting :run]
[9:58][Temporarily make OpenGLEndFrame() only submit the light probe textures ten times][:lighting]
[10:57][Nsight :rendering time: 8ms / frame][:lighting :run]
[12:04][A few words on structured art, credited to Mike Biddlecombe][:speech]
[13:32][Make EndLightingComputation() stuff structured art into all faces of our light probe voxels, with Green in the East][:lighting]
[15:56][See our red-striped world][:lighting :run]
[16:38][Enable CompileZBiasProgram() apply the colour of our East faces][:lighting]
[18:01][Demo ~RemedyBG's new .str feature][:run]
[19:47][Fix our typo in CompileZBiasProgram()][:lighting]
[19:58][See our red- and green-striped world][:lighting :run]
[20:13][Make EndLightingComputation() stuff structured art into the South, North, Down and Up faces of our light probe voxels][:lighting]
[22:17][See that our green striping is not as expected][:lighting :run]
[22:39][Make EndLightingComputation() increase the spacing of our stripes][:lighting]
[24:27][See our distantly-spaced stripes][:lighting :run]
[24:41][Enable our closer-spaced stripes in EndLightingComputation()][:lighting]
[24:48][See our closer-spaced stripes][:lighting :run]
[25:08][Nsight :rendering time: 18ms / frame][:lighting :run]
[25:29][Capture a frame to determine that we must be CPU-bound][:lighting :run]
[26:10][Toggle off the structured art code in EndLightingComputation()][:lighting]
[26:21][Nsight :rendering time: 6 to 14ms / frame][:lighting :run]
[27:22][Check our GPU model: NVIDIA GeForce GTX 1080][:admin]
[27:51][Consider how best to fill our pixels, not using GPU Voxelisation because of its unordered access view][:lighting :rendering :speech]
[35:24][Disable voxel blending in OpenGLInit(), so we can see their boundaries][:lighting]
[36:15][Gauge the width of our voxels][:lighting :run]
[37:00][Make UpdateAndRenderWorld() set the WorldCameraRect based on the ExpectedFocus][:camera]
[39:59][See that our entire viewable region is fully lit][:camera :lighting :run]
[41:07][Consider our voxel grid to be too detailed][:lighting :run]
[41:35][Reduce our LIGHT_LOOKUP_VOXEL_DIM from 128 to 64][:lighting]
[41:59][Consider our voxel grid to be more reasonably detailed][:lighting :run]
[42:16][Reduce our LIGHT_LOOKUP_VOXEL_DIM from 64 to 32][:lighting]
[42:28][Consider our voxel grid to be roughly the right size, but the Y-band to be too thick][:lighting :run]
[44:07][Scan through CompileZBiasProgram() and EndLightingComputation() for possible bugs][:lighting :research]
[46:48][See eight narrow stripes along the X axis][:lighting :run]
[47:06][Understanding modulo operation][:lighting :mathematics :research]
[47:43][Toggle off the extraneous stripes EndLightingComputation()][:lighting]
[47:56][See four red stripes along X][:lighting :run]
[48:47][Try to apply Green to the LightWest in EndLightingComputation()][:lighting]
[49:26][See no difference, to determine that our problem is in the filling / :sampling of all faces of the voxels][:lighting :run]
[49:47][Disable the LightBounds resizing and positioning code in UpdateAndRenderWorld()][:lighting]
[51:46][Traverse the world with the determination to work on our spatial query][:lighting :run]
[52:37][Scan the code for any problems in our voxel specifications][:lighting :research]
[53:53][See no green stripes in Y, step in to UpdateAndRenderWorld() and inspect our InvLightDim][:lighting :run]
[56:11][Break in to a voxel submission in OpenGLEndFrame() and inspect the LightData][:lighting :run]
[59:41][Scrutinise our test striping code in EndLightingComputation(), and the voxel initialisation code in OpenGLBeginFrame()][:lighting :research]
[1:02:46][Excise stale OpenGL light values, and size the LightData in open_gl by the LIGHT_LOOKUP_VOXEL_DIM][:"data structure" :lighting]
[1:05:13][See our expected green stripes in Y][:lighting :run]
[1:05:32][Make EndLightingComputation() colour our :lighting bounds]
[1:06:30][See our four stripes in X and Y][:lighting :run]
[1:07:21][Consider using non-uniform voxel bounds, e.g. 64 × 64 × 32][:lighting :run]
[1:09:05][Make UpdateAndRenderWorld() form a square LightBounds][:lighting]
[1:10:18][See our square light bounds][:lighting :run]
[1:11:06][Make EndLightingComputation() stripe every other voxel][:lighting]
[1:11:32][See that our light probes tend to span two voxels][:lighting :run]
[1:12:43][Decrease the LIGHT_LOOKUP_VOXEL_DIM from 32 to 16][:lighting]
[1:12:55][See that we have roughly one voxel per light probe][:lighting :run]
[1:14:18][Increase the LIGHT_LOOKUP_VOXEL_DIM from 16 to 32][:lighting]
[1:14:36][Determine to light our world][:lighting :run]
[1:14:45][Nuke our striped :lighting, and stuff the West face of all voxels with white][:lighting]
[1:15:42][See our uniformly lit world][:lighting :run]
[1:16:05][Consider our :lighting equation][:lighting :research]
[1:20:57][Simple Fragment :Lighting][:blackboard]
[1:25:59][Reflection Vector][:blackboard :mathematics]
[1:28:52][HOWTO search "reflection" in the episode guide[ref
    site="Handmade Hero"
    page="Episode Guide"
    url=https://handmadehero.org/watch#EpisodeGuide]][:research]
[1:29:19][Compute our reflection vector in CompileZBiasProgram()[ref
    site="OpenGL Registry"
    page="The OpenGL Shading Language 1.50 Quick Reference Card"
    url=https://www.khronos.org/files/opengl-quick-reference-card.pdf]][:lighting]
[1:32:36][:Run successfully][:lighting]
[1:32:38][Make CompileZBiasProgram() sample the :lighting specularly from the direction of the reflection vector, introducing GetIrradiance()]
[1:37:31][See our west-lit world][:lighting :run]
[1:37:46][Check our :lighting equation in CompileZBiasProgram()][:research]
[1:39:30][Consider our :lighting to be exactly right, except for the falloff][:run]
[1:40:58][Try making EndLightingComputation() light from the East][:lighting]
[1:41:22][See our east-lit world][:lighting :run]
[1:41:44][Note that we're computing the :lighting based on the debug :camera][:run]
[1:42:29][Try making EndLightingComputation() light from the South][:lighting]
[1:42:49][See our south-lit world, and wonder if the reflection is wrong][:lighting :run]
[1:44:07][Scrutinise our :lighting normals in CompileZBiasProgram()][:research]
[1:46:06][Note that our sprite normals are probably wrong][:lighting :run]
[1:47:14][Try making EndLightingComputation() light from the North][:lighting]
[1:47:32][See our north-lit world][:lighting :run]
[1:47:40][Try making EndLightingComputation() light from Below][:lighting]
[1:47:55][See our below-lit world][:lighting :run]
[1:48:04][Try making EndLightingComputation() light from Above][:lighting]
[1:48:14][See our above-lit world][:lighting :run]
[1:48:27][Make EndLightingComputation() light purple from above and yellow from below][:lighting]
[1:49:05][See our colourfully-lit world][:lighting :run]
[1:50:13][Q&A][:speech]
[1:50:47][@somebody_took_my_name][Q: Shouldn't it be R = I + 2*…, adding instead of subtracting the vectors?][:lighting]
[1:51:42][Flip the reflection vector computation in CompileZBiasProgram()][:lighting]
[1:52:10][See our (in)correctly lit world][:lighting :run]
[1:53:52][@xxthebigfoxx][Q: I think subtraction is right, actually, isn't it?][:mathematics]
[1:54:01][Reflection Vector Direction][:blackboard :mathematics]
[1:56:27][Flip back the reflection vector computation in CompileZBiasProgram()][:lighting]
[1:56:42][Reflection Vector Direction, continued][:blackboard :mathematics]
[1:58:09][See our purple sky reflection][:lighting :run]
[1:58:37][@vaualbus][Q: So where would you put material information for the :lighting? In the ray tracing part of the algorithm, that we still have not plugged in, or in the shader?]
[2:03:30][@xxthebigfoxx][Q: Are the AVX load instructions actually fast? Have you tested them?]
[2:04:31][@vaualbus][Q: Like this photo?[ref
    site="Real World Tech"
    page="NVIDIA’s GT200: Inside a Parallel Processor"
    url=https://www.realworldtech.com/gt200/11/]]
[2:06:16][@vaualbus][Q: Were the PS3's SPUs good at texture :sampling?]
[2:09:41][Wrap it up][:speech]
[/video]
