[video output=day368 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Compiling and Linking Shaders in OpenGL" vod_platform=youtube id=37KXLsjTRBo annotator=Miblo]
[0:08][Recap and set the stage for the day]
[4:06][Attend to the "Getting max allowed samples for texture correctly" issue[ref
    site="GitHub"
    page="HandmadeHero/cpp Issues"
    url="https://github.com/HandmadeHero/cpp/issues"]]
[6:16]["Martins is almost always right"][quote 553]
[7:00][handmade_opengl.cpp: #define GL_MAX_COLOR_TEXTURE_SAMPLES and GL_MAX_DEPTH_TEXTURE_SAMPLES for OpenGLRenderCommands() to use]
[9:24][handmade_opengl.cpp: Drawing to the framebuffer and why we must call glBlitFramebuffer() to do a multisample resolve]
[12:12][Research glBlitFramebuffer()[ref
    site="docs.GL"
    page="glBlitFramebuffer"
    url="http://docs.gl/gl3/glBlitFramebuffer"]]
[14:19][Research how to do the multisample resolve[ref
    site="Khronos Wiki"
    page="Multisampling"
    url=https://www.khronos.org/opengl/wiki/Multisampling]]
[15:48][handmade_opengl.cpp: Enable OpenGLRenderCommands() to bind the framebuffer and perform the multisample resolve]
[20:28][handmade_opengl.cpp: #define GL_READ_FRAMEBUFFER and GL_DRAW_FRAMEBUFFER from the corearb.h[ref
    site="Khronos"
    page="glcorearb.h"
    url="https://www.khronos.org/registry/OpenGL/api/GL/glcorearb.h"]]
[21:13][win32_handmade.cpp: typedef gl_blit_framebuffer]
[23:27][Run the game to see that it just worked][quote 554]
[23:49][handmade_opengl.cpp: Re-enable the Z-buffer in OpenGLRenderCommands()]
[29:32][Consider which Image Format to use[ref
    site="Khronos Wiki"
    page="Image Format"
    url="https://www.khronos.org/opengl/wiki/Image_Format"]]
[33:25][Run the game to see that we have a depth buffer and multisample antialiasing, but that our colours are wrong]
[36:41][handmade_opengl.cpp: Make OpenGLRenderCommands() correctly iterate over the render targets]
[37:57][Determine that we are unable to set sRGB texture rendering on this graphics card]
[39:21][win32_handmade.cpp: Prevent Win32SetPixelFormat() from setting the depth bits]
[41:32][Run the game to see that the depth buffering is still working just fine]
[42:21][Why we did the multisample]
[45:04][View the cutscene and note that the projection and sRGB are incorrect]
[46:52][Blackboard: Our rendering pipeline]
[54:20][Blackboard: Using a Z-bias to cheat the values passed to the depth buffer]
[58:41][Blackboard: Object placement matrix]
[1:00:58][handmade_render_group.h: Add a ZBias to render_entry_bitmap]
[1:03:09][Run the game to see disastrous results and explain why]
[1:04:24][handmade_render_group.cpp: Make PushBitmap() set the ZBias and run the game to see everybody sucked out to infinity and beyond]
[1:05:25][handmade_render_group.cpp: Make PushBitmap() compute the ZBias in proportion to the Height]
[1:06:07][A few introductory words on shaders]
[1:09:32][Creating shaders in OpenGL[ref
    site="docs.GL"
    page="glShaderSource"
    url=http://docs.gl/gl3/glShaderSource]]
[1:12:57][handmade_opengl.cpp Remove OpenGLSetScreenspace()]
[1:13:22][handmade_opengl.cpp: Introduce OpenGLCreateProgram() in conjunction with docs.GL[ref
    site="docs.GL"
    page="glShaderSource"
    url=http://docs.gl/gl3/glShaderSource][ref
    site="docs.GL"
    page="glCreateShader"
    url=http://docs.gl/gl3/glCreateShader][ref
    site="docs.GL"
    page="glCompileShader"
    url=http://docs.gl/gl3/glCompileShader][ref
    site="docs.GL"
    page="glLinkProgram"
    url=http://docs.gl/gl3/glLinkProgram][ref
    site="docs.GL"
    page="glCreateProgram"
    url=http://docs.gl/gl3/glCreateProgram][ref
    site="docs.GL"
    page="glAttachShader"
    url=http://docs.gl/gl3/glAttachShader]]
[1:21:31][Summarise the shader creation process]
[1:22:52][win32_handmade.cpp: Bind the shader functions we need[ref
    site="Khronos"
    page="glcorearb.h"
    url="https://www.khronos.org/registry/OpenGL/api/GL/glcorearb.h"]]
[1:32:47][Compile and run to see our crazy w coordinate]
[1:33:56][Create handmade_opengl.h]
[1:36:18][handmade_opengl.cpp: Make OpenGLInit() call OpenGLCreateProgram(), and write here docs for Header, Vertex and Fragment code]
[1:41:57][Run the game to find that we got through the compilation phase okay, and determine to enable OpenGLCreateProgram() to perform error handling]
[1:44:21][handmade_opengl.cpp: Enable OpenGLCreateProgram() to log shader info and assert on validation failure[ref
    site=docs.GL
    page="glValidateProgram"
    url=http://docs.gl/gl3/glValidateProgram][ref
    site=docs.GL
    page="glGetProgram"
    url=http://docs.gl/gl3/glGetProgram][ref
    site=docs.GL
    page="glGetProgramInfoLog"
    url=http://docs.gl/gl3/glGetProgramInfoLog][ref
    site=docs.GL
    page="glGetShaderInfoLog"
    url=http://docs.gl/gl3/glGetShaderInfoLog][ref
    site="Khronos"
    page="glcorearb.h"
    url="https://www.khronos.org/registry/OpenGL/api/GL/glcorearb.h"]]
[1:53:23][Compile and step into OpenGLCreateProgram() to see that we pass shader validation]
[1:55:06][Q&A][:speech]
[1:55:13][@fr0styninja][Cam died]
[1:56:05][@soysaucethekid][For some of the OpenGL function typedefs, you have the WINAPI entrypoint and others don't. I thought it was necessary to have it or else you get run-time errors when calling those functions (or at least I did)]
[1:57:13][@thesizik][Instead of Z-bias, why not make the sprite cards stand up at a steeper angle, and make them trapezoidal to undo the perspective foreshortening?]
[1:58:14][@bimbinel][When you started writing the placeholder shader code you mentioned something about “C++ ??? docs” that are not yet fully implemented. What is this feature exactly?[ref
    site="Wikipedia"
    page="Here document"
    url="https://en.wikipedia.org/wiki/Here_document"]]
[2:01:36][@pepevel][Do you think the Google's angle library (that translates OpenGL to DirectX calls) would solve the sRGB problem on your graphics card?]
[2:02:24][@gunstarrhero][Why are you downsizing 8 pixels into one using blit and not using 32 bit math and rendering 6 back into 2 with a subtract to finalize 8? 2 pass out of 8 bit back to render allows alpha on/off values and colour value attach. ( A|C| instead of colour value) where alpha belongs in blit, define each pixel]
[2:03:24][@insofaras][You can pass NULL as the length param to glShaderSource and it treats all the strings as null terminated]
[2:03:35][handmade_opengl.cpp: Make OpenGLCreateProgram() pass NULL to glShaderSource()]
[2:04:44][@fr0styninja][Can't we just adjust gamma in the shaders?]
[2:05:27][@fr0styninja][Regarding checking shaders status. Believe best practice is checking GL_COMPILE_STATUS after compiling a shader and then GL_LINK_STATUS after linking a program]
[2:06:25][@bimbinel][Are you eventually going to move shader code into the asset packs, or are you going to keep it inline?]
[2:06:45][@thesizik][Won't there still be problems if a tree is in front of a tall block, if the sprite still technically intersects the tile above?]
[2:08:04][@aceflameseer][Will you implement shader "hotloading"?]
[2:10:01][@enemymouse][Hotloading seems safest with the use of BindAttribLocation, correct, so as not to have to chase locations all over the place?]
[2:10:46][@xyane][Last time I was here you talked about the int32x types. What are your thoughts on type space vs cache utilization?]
[2:12:17][@ratchetfreak][If you recreate the program when hot reloading, you should probably free the old shaders and program]
[2:13:52][@abarishu][Are those programs cleared automatically when the game exits?]
[2:14:43][@macielda][Do you have opinions about Temporal AA?]
[2:14:52][@xyane][I assume that you dont give much thought to how hot data is? I remember a talk by Andrei that you could get a few percent speed up just from organizing the data according to hotness]
[2:17:04][@abarishu]["Unless there is a bug in the driver or in Windows..." Yeah, there are never any bugs in those]
[2:18:14][@xyane][Will you eventually be doing such a pass over Handmade Hero?]
[2:18:32][@pepevel][Should you add a \\n at the end of each line with the format you are using? Wouldn't it be parsed by OpenGL as a long comment as it is now?]
[2:19:44][@starchypancakes][Hey Casey, I got a job as a gameplay programmer! Wouldn't have happened without this stream, not in a million years]
[2:20:23][A few words on gameplay programming][:speech]
[2:22:37][Wrap the rest of the stream up with well wishes for @starchypancakes][:speech][quote 555]
[/video]
