[video output=day387 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Further Attempts at Multisampled Depth Peeling" vod_platform=youtube id=SJRwEVr4HSw annotator=Miblo] [0:08][Recap and set the stage for the day] [1:28][Run the game to show our custom multi-resolution resolve with and without multisampling, and describe the problem that multisampling introduces for our depth peeling scheme] [10:05][handmade_opengl.cpp: Read through CompileResolveMultisample(), and tweak it to specify GLSL version 1.50] [10:56][Run the game to see that it works with GLSL 1.50 specified] [11:40][Continue reading through CompileResolveMultisample()] [12:40][Show the offset bug with ~Milton] [14:12][Blackboard: Multisample Resolve] [24:07][Blackboard: Picking a primitive's most distant sample from the camera] [28:51][handmade_opengl.cpp: Make CompileResolveMultisample() sample the colour from the most distant pixel of primitives] [41:28][Compile and run to see weird artifacts] [42:05][handmade_opengl.cpp: Read through CompileResolveMultisample() and make it correctly set the Depth] [45:14][Run the game to see that we're not getting smoothing along edges] [45:42][handmade_opengl.cpp: Increase the DepthThreshold in CompileResolveMultisample() and run the game to see the smoothing] [46:34][Consider always taking a particular depth sample for depth peeling purposes] [49:00][handmade_opengl.cpp: Revert the DepthThreshold, and rewrite CompileResolveMultisample() to only track the DepthMin] [51:17][Run the game to see artifacts at the primitive edges] [51:48][handmade_opengl.cpp: Introduce a centroid to set FragZ in a way that won't vary per sample in CompileResolveMultisample()] [56:44][Run the game to still see the artifacts] [57:15][handmade_opengl.cpp: Enable CompileResolveMultisample() to visualise the number of unique samples] [1:05:57][Run the game to see our debug visualisation] [1:06:53][handmade_opengl.cpp: Enable CompileResolveMultisample() to colourise our debug visualisation] [1:07:49][Run the game to see that we are getting two unique depth samples throughout the scene, and consider why] [1:10:23][handmade_opengl.cpp: Make CompileResolveMultisample() hard set the InputZ to 0.5] [1:11:13][Run the game to view our debug visualisation] [1:12:17][handmade.cpp and handmade_platform.h: And a MultisamplingDebug toggle to the debug system] [1:19:16][Run the game and toggle between the debug visualisation and regular view] [1:20:08][handmade_opengl.cpp: Make CompileResolveMultisample() correctly set the InputZ, run the game and inspect the MultisamplingDebug view] [1:22:16][Propose taking the background out of the equation] [1:23:00][handmade_opengl.cpp: Enable CompileResolveMultisample() to skip sampling the background] [1:26:09][Run the game to see that we don't get multisamples when there's only one primitive] [1:26:53][handmade_opengl.cpp: Prevent CompileResolveMultisample() from using the InputZ and run the game to see that everything has multisamples] [1:32:36][Inspect a screenshot to see that no blending occurs where there is only one depth value] [1:33:12][handmade_opengl.cpp: Make CompileResolveMultisample() compute the InvSampleCount from the full SampleCount] [1:34:48][Run the game to see that it now computes the correct colour, but does not sum up properly, and consider why] [1:36:40][Note that premultiplied alpha and gamma correction don't work well together] [1:38:23][handmade_opengl.cpp: Try to make CompileResolveMultisample() un-premultiply alpha and then reintroduce the alpha after producing the average colour value] [1:39:51][win32_handmade.cpp: Switch back to 1280x720 and run the game] [1:41:29][Consider two things: It'd be nice to fix the unique sample picking, but there still may be issues with multiple depth peels across the scene] [1:43:15][handmade_platform.h and win32_handmade.cpp: Use 2x oversampling, run the game and inspect a screenshot] [1:46:46][handmade_opengl.cpp: Consider enabling OpenGLRenderCommands() to correctly perform oversampling] [1:48:23][win32_handmade.cpp: Switch to 1920x1080, run the game and consider downsampling that to a much lower resolution on our card] [1:49:22][Consider getting the depth peel buffers to work in multisampling mode] [1:50:19][Q&A][:speech] [1:51:43][@dmitsuki][I can't compile the code, it's saying "Requires extension support: sampler2DMS (GL_ARB_texture_multisample)". But not having support for this makes no sense because I have an R9 390, which is a newer AMD card than you] [1:52:30][@fr0styninja][Haven't really followed along with how you've implemented peeling but what if you separate out 3D objects and run them through a different shader that doesn't do peeling?] [1:52:51][@pragmascrypt][Would doing a depth pre-pass without multisampling help?] [1:53:29][@flyingsolomon][What do you think about ffmpeg and its likes? In your opinion is there a better way to implement a video-oriented program (with multiple codec support) without going nuts?] [1:53:50][@cubercaleb][If you want the same depth for each multi-sample, couldn't you write the depth as a separate vertex shader output with centroid interpolation?] [1:55:15][Run the game to show how the centroid sampling works great, but that at the seam between triangles we do get multiple samples] [1:56:22][@dmitsuki][It works! Is that version defining what version of OpenGL that's going to be used? Which version is 150?] [1:57:36][@serge_rgb][Hey Casey. Sorry about the cursor bug! Could you try creating a new canvas to see if it still happens? I missed the start of the stream but people told me that it only happens with wacom input. Is that true?] [1:58:04][Blackboard: Show the offset input with the wacom tablet] [2:02:39][@Kknewkles][Hi Casey! Do you have a few more good scientific-programmy papers to get me started on a good habit of reading long stuff for coding? I do remember those from "Papers I Loved" and the rasterization bridge one. Maybe there are some lighter reads for to begin on this road?[ref site="Melissa E. O'Neill" page="PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation" url="http://www.pcg-random.org/pdf/toms-oneill-pcg-family-v1.02.pdf"]] [2:08:07][@fr0styninja][How's 1935 coming along? Long time no news] [2:08:54][@flyingsolomon][If thread behavior is considered to be completely random, can we leverage it to our random number generator?[ref site="Wikipedia" page="RdRand" url="https://en.wikipedia.org/wiki/RdRand"]] [2:11:32][@cubercaleb][Isn't PCG less favorable than something like Xorshift for games because the stepping function can't be SSE optimized?[ref site="Melissa E. O'Neill" page="PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation" url="http://www.pcg-random.org/pdf/toms-oneill-pcg-family-v1.02.pdf"]] [2:17:13][@rooctag][How come there are different Z values on the diagonal on the same sprite? Is it an epsilon issue, or did I miss something?] [2:19:59][Wrap it up][:speech] [/video]