[video output=day560 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Querying Irradiance Directly from Voxels" vod_platform=youtube id=3w_JPx14aS8 annotator=Miblo]
[0:01][We are working on :lighting][:speech]
[0:41][Plug Molly Rocket's Discord channel[ref
    site=Discord
    page=MollyRocket
    url=https://discord.gg/mollyrocket] and the Watch Page[ref
        site="Handmade Hero"
        page="Watch"
        url=https://handmadehero.org/watch] with best wishes to our friends in Japan near Typhoon Hagibis][:speech]
[2:39][Plug the upcoming [@naysayer88 Jon][ref
    site=Twitch
    page=Naysayer88
    url=https://twitch.tv/naysayer88] & [@cmuratori Casey][ref
    site=Twitch
    page=cmuratori
    url=https://twitch.tv/cmuratori] gaming stream][:speech]
[3:55][Experimentally getting the :lighting into the fragment shader, with thoughts on specialist vs generalist programming for GPUs][:speech]
[9:11][Reconstituting the inbound :lighting from our light probes, to light pixels][:speech]
[12:10][Contributing the light from only the three front faces][:lighting :speech]
[14:05][On the need to trilinear blend multiple light probes][:lighting :speech]
[16:56][Using a 3D texture voxel representation of the :lighting, to simplify things for the GPU][:speech]
[19:57][Switch CompileZBiasProgram() over to represent the light probes as a 3D texture[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]
[32:32][Hit an OpenGL shader error][:lighting :run]
[33:09][Fix typo in CompileZBiasProgram()][:lighting]
[34:05][See that everything is black][:lighting :run]
[34:57][Temporarily make CompileZBiasProgram() set the LightData to the WorldN][:lighting]
[35:14][See our colourful world][:lighting :run]
[36:03][Temporarily make CompileZBiasProgram() shift the light into the visible colour range][:lighting]
[37:14][See our fully colourful world][:lighting :run]
[38:15][Set up first to output voxels directly to the GPU, then send just the list of light probes][:lighting :speech]
[40:02][GPU Voxelization[ref
    site="NVIDIA GameWorks"
    page="The Basics of GPU Voxelization"
    url=https://developer.nvidia.com/content/basics-gpu-voxelization]][:lighting :research]
[43:32][Dear NVIDIA, Why does GPU Voxelization require us to use an unordered access view?][:"data structure" :lighting]
[45:42][Set up to send our entire voxel grid at 2,800 MB / sec][:lighting :speech]
[47:23][Make CompileZBiasProgram() submit our six-faced light probes as 3D textures[ref
    site="docs.GL"
    page="glTexParameter"
    url=http://docs.gl/gl3/glTexParameter][ref
    site="Khronos"
    page="glext.h"
    url=https://www.khronos.org/registry/OpenGL/api/GL/glext.h]][:lighting]
[1:05:46][See a black screen with little seams][:lighting :run]
[1:06:11][Make EndLightingComputation() stuff red into the West face of our light probe voxels][:lighting]
[1:10:58][See our red world][:lighting :run]
[1:11:26][Test our spatial querying, by making EndLightingComputation() colour the voxels alternately red / blue][:lighting]
[1:12:04][See a fully blue world][:lighting :run]
[1:12:39][Augment zbias_program and render_setup with VoxelMinCorner and VoxelInvTotalDim for CompileZBiasProgram() to use][:lighting]
[1:19:04][Still see a fully blue world][:lighting :run]
[1:19:24][Introduce SetLightBounds() for UpdateAndRenderWorld() to call][:lighting]
[1:24:36][See our alternately red / blue world][:lighting :run]
[1:25:11][Make EndLightingComputation() stripe our lighting in all three dimensions][:lighting]
[1:26:52][Check out our tartan world][:lighting :run]
[1:27:19][Flip our stripes in EndLightingComputation() from RGBA to BGRA][:lighting]
[1:27:35][Check out our tartan world][:lighting :run]
[1:29:36][Check out our tartan world in release mode][:lighting :run]
[1:30:47][Nsight :rendering time: 22ms / frame][:run]
[1:31:29][Capture a frame to see that we may be CPU-bound][:rendering :run]
[1:32:45][Prevent EndLightingComputation() from striping the world][:lighting]
[1:33:00][Nsight :rendering time: 22ms / frame][:run]
[1:33:43][Q&A][:speech]
[1:35:31][@dithinas][Q: In the pre-stream when you were talking about creating command buffers in your theoretical graphics :API, would this be like a buffer you would dynamically assemble GPU machine code into, or is this something that the driver would need to translate for you to the GPU machine code?]
[1:37:29][@derpzerker][Q: Isn't SPIR-V the thing you are talking about?][:language]
[1:39:16][@fableprotector][Unrelated Q: How would a highlight shader work, e.g. if you want to select a sprite you'd want to color the edges of a sprite in some color? Is this done via the stencil buffer?]
[1:41:54][@Brian][Q: What happened with the profiler? Just before you ended the stream, you mentioned you want to re-enable the profiler (I assume it's the [~hero Handmade Hero] one). Was it disabled, or just not tracking for this part of the code?][:"debug system"]
[1:43:13][@Brian][Q: Have fun gaming with [@naysayer88 Jon]]
[1:43:18][Thank you everyone, with a plug of the [@naysayer88 Jon][ref
    site=Twitch
    page=Naysayer88
    url=https://twitch.tv/naysayer88] & [@cmuratori Casey][ref
    site=Twitch
    page=cmuratori
    url=https://twitch.tv/cmuratori] gaming stream][:speech]
[/video]
