Handmade Hero»Episode Guide
Using Strictly OpenGL Core Profile
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:16Run the game to recap and set the stage for the day, with a few words on using 3D APIs
0:16Run the game to recap and set the stage for the day, with a few words on using 3D APIs
0:16Run the game to recap and set the stage for the day, with a few words on using 3D APIs
4:44Determine to field debug messages and conditionally disable compatibility contexts
4:44Determine to field debug messages and conditionally disable compatibility contexts
4:44Determine to field debug messages and conditionally disable compatibility contexts
10:55glDebugMessageCallback1
10:55glDebugMessageCallback1
10:55glDebugMessageCallback1
14:34glDebugMessageControl2
14:34glDebugMessageControl2
14:34glDebugMessageControl2
16:16GL_ARB_debug_output3
16:16GL_ARB_debug_output3
16:16GL_ARB_debug_output3
23:18win32_handmade.cpp: Pull in GLDEBUGPROC() and glDebugMessageCallbackARB() from corearb.h4
23:18win32_handmade.cpp: Pull in GLDEBUGPROC() and glDebugMessageCallbackARB() from corearb.h4
23:18win32_handmade.cpp: Pull in GLDEBUGPROC() and glDebugMessageCallbackARB() from corearb.h4
29:31handmade_opengl.cpp: Make OpenGLInit() call glDebugMessageCallbackARB()
29:31handmade_opengl.cpp: Make OpenGLInit() call glDebugMessageCallbackARB()
29:31handmade_opengl.cpp: Make OpenGLInit() call glDebugMessageCallbackARB()
30:13Run the game to successfully receive our callback and view an error
30:13Run the game to successfully receive our callback and view an error
30:13Run the game to successfully receive our callback and view an error
32:22handmade_opengl.cpp: Make OpenGLInit() perform the callback later
32:22handmade_opengl.cpp: Make OpenGLInit() perform the callback later
32:22handmade_opengl.cpp: Make OpenGLInit() perform the callback later
32:52Run the game and receive no errors
32:52Run the game and receive no errors
32:52Run the game and receive no errors
33:18win32_handmade.cpp: Switch to the OpenGL Core Profile and set WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
33:18win32_handmade.cpp: Switch to the OpenGL Core Profile and set WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
33:18win32_handmade.cpp: Switch to the OpenGL Core Profile and set WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
34:42Run the game and get an error message
34:42Run the game and get an error message
34:42Run the game and get an error message
36:16handmade_opengl.cpp: Prevent OpenGLInit() from calling glTexEnvi()
36:16handmade_opengl.cpp: Prevent OpenGLInit() from calling glTexEnvi()
36:16handmade_opengl.cpp: Prevent OpenGLInit() from calling glTexEnvi()
36:24Run the game to find that glAlphaFunc() has been removed
36:24Run the game to find that glAlphaFunc() has been removed
36:24Run the game to find that glAlphaFunc() has been removed
36:51On why glAlphaFunc() is no longer necessary
36:51On why glAlphaFunc() is no longer necessary
36:51On why glAlphaFunc() is no longer necessary
38:23handmade_opengl.cpp: Make the FragmentCode conditionally apply blending and OpenGLRenderCommands() no longer call glAlphaFunc()
38:23handmade_opengl.cpp: Make the FragmentCode conditionally apply blending and OpenGLRenderCommands() no longer call glAlphaFunc()
38:23handmade_opengl.cpp: Make the FragmentCode conditionally apply blending and OpenGLRenderCommands() no longer call glAlphaFunc()
40:40handmade_opengl.cpp: Prevent OpenGLRenderCommands() from enabling GL_ALPHA_TEST
40:40handmade_opengl.cpp: Prevent OpenGLRenderCommands() from enabling GL_ALPHA_TEST
40:40handmade_opengl.cpp: Prevent OpenGLRenderCommands() from enabling GL_ALPHA_TEST
41:00Note that depth testing doesn't occur in the shader
41:00Note that depth testing doesn't occur in the shader
41:00Note that depth testing doesn't occur in the shader
42:14handmade_opengl.cpp: Prevent OpenGLRenderCommands() from enabling GL_TEXTURE_2D and the glMatrixMode() stuff
42:14handmade_opengl.cpp: Prevent OpenGLRenderCommands() from enabling GL_TEXTURE_2D and the glMatrixMode() stuff
42:14handmade_opengl.cpp: Prevent OpenGLRenderCommands() from enabling GL_TEXTURE_2D and the glMatrixMode() stuff
43:22Run the game and realise that we must create and bind a vertex array objectα
43:22Run the game and realise that we must create and bind a vertex array objectα
43:22Run the game and realise that we must create and bind a vertex array objectα
44:49handmade_opengl.cpp: Make OpenGLInit() call glGenVertexArrays()5 and glBindVertexArray()6
44:49handmade_opengl.cpp: Make OpenGLInit() call glGenVertexArrays()5 and glBindVertexArray()6
44:49handmade_opengl.cpp: Make OpenGLInit() call glGenVertexArrays()5 and glBindVertexArray()6
48:28Run the game and receive apparently the opposite error from before
48:28Run the game and receive apparently the opposite error from before
48:28Run the game and receive apparently the opposite error from before
52:13Note that we are using client-side memory and consider switching to GPU-mapped memory
52:13Note that we are using client-side memory and consider switching to GPU-mapped memory
52:13Note that we are using client-side memory and consider switching to GPU-mapped memory
57:33handmade_opengl.cpp: Make OpenGLInit() call glGenBuffers()7 to store the vertex array
57:33handmade_opengl.cpp: Make OpenGLInit() call glGenBuffers()7 to store the vertex array
57:33handmade_opengl.cpp: Make OpenGLInit() call glGenBuffers()7 to store the vertex array
1:01:32handmade_opengl.cpp: Make OpenGLRenderCommands() call glBufferData()8 for that GL_ARRAY_BUFFER
1:01:32handmade_opengl.cpp: Make OpenGLRenderCommands() call glBufferData()8 for that GL_ARRAY_BUFFER
1:01:32handmade_opengl.cpp: Make OpenGLRenderCommands() call glBufferData()8 for that GL_ARRAY_BUFFER
1:04:28A few words on how this buffer has improved the rendering pipeline
1:04:28A few words on how this buffer has improved the rendering pipeline
1:04:28A few words on how this buffer has improved the rendering pipeline
1:07:08handmade_opengl.cpp and win32_handmade.cpp: Pull in the necessary calls from corearb.h9
1:07:08handmade_opengl.cpp and win32_handmade.cpp: Pull in the necessary calls from corearb.h9
1:07:08handmade_opengl.cpp and win32_handmade.cpp: Pull in the necessary calls from corearb.h9
1:10:21Run the game to find that we have passed the glVertexAttribPointer error, and that the final error is relating to GL_QUADS
1:10:21Run the game to find that we have passed the glVertexAttribPointer error, and that the final error is relating to GL_QUADS
1:10:21Run the game to find that we have passed the glVertexAttribPointer error, and that the final error is relating to GL_QUADS
1:11:57On why there may not be a fix for this GL_QUADS error
1:11:57On why there may not be a fix for this GL_QUADS error
1:11:57On why there may not be a fix for this GL_QUADS error
1:15:08Blackboard: Vertex Sharing
1:15:08Blackboard: Vertex Sharing
1:15:08Blackboard: Vertex Sharing
1:17:25Blackboard: Specifying the vertices with an Index stream
1:17:25Blackboard: Specifying the vertices with an Index stream
1:17:25Blackboard: Specifying the vertices with an Index stream
1:22:31handmade_opengl.cpp: Re-enable GL_QUADS, turn off the debug messages, and run the game to find that we're not getting a working image
1:22:31handmade_opengl.cpp: Re-enable GL_QUADS, turn off the debug messages, and run the game to find that we're not getting a working image
1:22:31handmade_opengl.cpp: Re-enable GL_QUADS, turn off the debug messages, and run the game to find that we're not getting a working image
1:23:31win32_handmade.cpp: Turn off WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, and run the game to find that it's now okay
1:23:31win32_handmade.cpp: Turn off WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, and run the game to find that it's now okay
1:23:31win32_handmade.cpp: Turn off WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, and run the game to find that it's now okay
1:24:17Blackboard: Our options regarding the WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB bit, GL_QUADS and GL_TRIANGLE_STRIP
1:24:17Blackboard: Our options regarding the WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB bit, GL_QUADS and GL_TRIANGLE_STRIP
1:24:17Blackboard: Our options regarding the WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB bit, GL_QUADS and GL_TRIANGLE_STRIP
1:31:41handmade_opengl.cpp: Change GL_QUADS to GL_TRIANGLE_STRIP in OpenGLRenderCommands(), and re-enable the debug message
1:31:41handmade_opengl.cpp: Change GL_QUADS to GL_TRIANGLE_STRIP in OpenGLRenderCommands(), and re-enable the debug message
1:31:41handmade_opengl.cpp: Change GL_QUADS to GL_TRIANGLE_STRIP in OpenGLRenderCommands(), and re-enable the debug message
1:32:59Run the game to see that this is not correct because the vertex order is wrong
1:32:59Run the game to see that this is not correct because the vertex order is wrong
1:32:59Run the game to see that this is not correct because the vertex order is wrong
1:33:24handmade_opengl.cpp: Re-enable the debug message and WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
1:33:24handmade_opengl.cpp: Re-enable the debug message and WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
1:33:24handmade_opengl.cpp: Re-enable the debug message and WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
1:34:11Run the game to see that we're completely compliant, but just drawing wrong
1:34:11Run the game to see that we're completely compliant, but just drawing wrong
1:34:11Run the game to see that we're completely compliant, but just drawing wrong
1:34:21handmade_render_group.cpp: Switch PushQuad() to push the vertices in the correct order for GL_TRIANGLE_STRIP
1:34:21handmade_render_group.cpp: Switch PushQuad() to push the vertices in the correct order for GL_TRIANGLE_STRIP
1:34:21handmade_render_group.cpp: Switch PushQuad() to push the vertices in the correct order for GL_TRIANGLE_STRIP
1:35:18Run the game to see that it is now correct, and note that this won't work if we had a texture atlas
1:35:18Run the game to see that it is now correct, and note that this won't work if we had a texture atlas
1:35:18Run the game to see that it is now correct, and note that this won't work if we had a texture atlas
1:38:53Determine to get the orthographic projection back online for the debug view
1:38:53Determine to get the orthographic projection back online for the debug view
1:38:53Determine to get the orthographic projection back online for the debug view
1:43:25handmade_math.h: Enable OrthographicProjection() to use the near and far clip planes
1:43:25handmade_math.h: Enable OrthographicProjection() to use the near and far clip planes
1:43:25handmade_math.h: Enable OrthographicProjection() to use the near and far clip planes
1:45:16Run the game and note that we'll need to deal with the camera part of the transform for the debug UI
1:45:16Run the game and note that we'll need to deal with the camera part of the transform for the debug UI
1:45:16Run the game and note that we'll need to deal with the camera part of the transform for the debug UI
1:47:37handmade_debug.cpp: Consider how the SetCameraTransform() call in DEBUGStart() is now massively wrong
1:47:37handmade_debug.cpp: Consider how the SetCameraTransform() call in DEBUGStart() is now massively wrong
1:47:37handmade_debug.cpp: Consider how the SetCameraTransform() call in DEBUGStart() is now massively wrong
1:49:02handmade_debug.cpp: Make SetCameraTransform() use and scale the CameraX and CameraY
1:49:02handmade_debug.cpp: Make SetCameraTransform() use and scale the CameraX and CameraY
1:49:02handmade_debug.cpp: Make SetCameraTransform() use and scale the CameraX and CameraY
1:50:16Blackboard: Mapping the extremities of the screen to -1 to 1
1:50:16Blackboard: Mapping the extremities of the screen to -1 to 1
1:50:16Blackboard: Mapping the extremities of the screen to -1 to 1
1:52:36Run the game and assess our clip plane situation
1:52:36Run the game and assess our clip plane situation
1:52:36Run the game and assess our clip plane situation
1:54:14handmade_debug.cpp: Begin to consider what else in DEBUGStart() may be problematic
1:54:14handmade_debug.cpp: Begin to consider what else in DEBUGStart() may be problematic
1:54:14handmade_debug.cpp: Begin to consider what else in DEBUGStart() may be problematic
1:55:29Q&A
🗩
1:55:29Q&A
🗩
1:55:29Q&A
🗩
1:56:49ratchet_freak Where's owlbot? He's not online
🗪
1:56:49ratchet_freak Where's owlbot? He's not online
🗪
1:56:49ratchet_freak Where's owlbot? He's not online
🗪
1:59:19macielda About the QUAD thing, you might want to do something like this, maybe10
🗪
1:59:19macielda About the QUAD thing, you might want to do something like this, maybe10
🗪
1:59:19macielda About the QUAD thing, you might want to do something like this, maybe10
🗪
2:01:33alephant You could avoid geometry shaders by instancing a triangle strip that is just a quad
🗪
2:01:33alephant You could avoid geometry shaders by instancing a triangle strip that is just a quad
🗪
2:01:33alephant You could avoid geometry shaders by instancing a triangle strip that is just a quad
🗪
2:02:21hguleryuz What do you think about using a different set of program / shader for debug text, one which has no projection matrix at all? Would it be bad to switch programs for GUI text performance-wise?
🗪
2:02:21hguleryuz What do you think about using a different set of program / shader for debug text, one which has no projection matrix at all? Would it be bad to switch programs for GUI text performance-wise?
🗪
2:02:21hguleryuz What do you think about using a different set of program / shader for debug text, one which has no projection matrix at all? Would it be bad to switch programs for GUI text performance-wise?
🗪
2:05:40ratchetfreak There is a third way of setting the vertex data through ARB_separate_attrib_format (went to core in 4.3). This separates the vertex format from the buffer it reads the data from which is more optimal for the driver
🗪
2:05:40ratchetfreak There is a third way of setting the vertex data through ARB_separate_attrib_format (went to core in 4.3). This separates the vertex format from the buffer it reads the data from which is more optimal for the driver
🗪
2:05:40ratchetfreak There is a third way of setting the vertex data through ARB_separate_attrib_format (went to core in 4.3). This separates the vertex format from the buffer it reads the data from which is more optimal for the driver
🗪
2:06:32robrobby When the engine uses a deprecated function like GL_QUADS, what are the main issues that people would have to deal with playing this game, because it is running, right?
🗪
2:06:32robrobby When the engine uses a deprecated function like GL_QUADS, what are the main issues that people would have to deal with playing this game, because it is running, right?
🗪
2:06:32robrobby When the engine uses a deprecated function like GL_QUADS, what are the main issues that people would have to deal with playing this game, because it is running, right?
🗪
2:09:05soysaucethekid Is OpenGL 3.0 the target version?
🗪
2:09:05soysaucethekid Is OpenGL 3.0 the target version?
🗪
2:09:05soysaucethekid Is OpenGL 3.0 the target version?
🗪
2:11:14rizoma80 Any idea why one can have stuttering problems using OpenGL DWM stuff related?
🗪
2:11:14rizoma80 Any idea why one can have stuttering problems using OpenGL DWM stuff related?
🗪
2:11:14rizoma80 Any idea why one can have stuttering problems using OpenGL DWM stuff related?
🗪
2:14:01macielda What do you like better in OpenGL AZDO as opposed to Vulkan?
🗪
2:14:01macielda What do you like better in OpenGL AZDO as opposed to Vulkan?
🗪
2:14:01macielda What do you like better in OpenGL AZDO as opposed to Vulkan?
🗪
2:18:35pepevel Would it be interesting to implement OpenGL on top of OpenCL?
🗪
2:18:35pepevel Would it be interesting to implement OpenGL on top of OpenCL?
🗪
2:18:35pepevel Would it be interesting to implement OpenGL on top of OpenCL?
🗪
2:19:54robrobby Since Handmade Hero is using multithreaded processing of the game entities, how would the game even stutter when time wouldn't be enough 'til the next frame?
🗪
2:19:54robrobby Since Handmade Hero is using multithreaded processing of the game entities, how would the game even stutter when time wouldn't be enough 'til the next frame?
🗪
2:19:54robrobby Since Handmade Hero is using multithreaded processing of the game entities, how would the game even stutter when time wouldn't be enough 'til the next frame?
🗪
2:21:01Shut this down
🗩
2:21:01Shut this down
🗩
2:21:01Shut this down
🗩