Handmade Hero»Episode Guide
OpenGL Vertex Arrays
?
?

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:04Recap and set the stage for the day
0:04Recap and set the stage for the day
0:04Recap and set the stage for the day
1:34Run the game and note that the sprites are all being submitted separately
1:34Run the game and note that the sprites are all being submitted separately
1:34Run the game and note that the sprites are all being submitted separately
4:21handmade_render_group.cpp: Enable PushBitmap() to append new textured quads to the CurrentQuads array
4:21handmade_render_group.cpp: Enable PushBitmap() to append new textured quads to the CurrentQuads array
4:21handmade_render_group.cpp: Enable PushBitmap() to append new textured quads to the CurrentQuads array
13:07Run the game to see where we were before
13:07Run the game to see where we were before
13:07Run the game to see where we were before
13:21handmade_render_group.cpp: Enable PushBitmap() to push the quads on in a coherent way
13:21handmade_render_group.cpp: Enable PushBitmap() to push the quads on in a coherent way
13:21handmade_render_group.cpp: Enable PushBitmap() to push the quads on in a coherent way
16:29Run the game and step in to OpenGLRenderCommands() to inspect the QuadCount
16:29Run the game and step in to OpenGLRenderCommands() to inspect the QuadCount
16:29Run the game and step in to OpenGLRenderCommands() to inspect the QuadCount
19:05handmade_render_group.cpp: Introduce GetCurrentQuads()
19:05handmade_render_group.cpp: Introduce GetCurrentQuads()
19:05handmade_render_group.cpp: Introduce GetCurrentQuads()
24:50handmade_render_group.cpp: Make PushCube() construct the cube data inline
24:50handmade_render_group.cpp: Make PushCube() construct the cube data inline
24:50handmade_render_group.cpp: Make PushCube() construct the cube data inline
27:37handmade_render_group.cpp: Introduce PushQuad()
27:37handmade_render_group.cpp: Introduce PushQuad()
27:37handmade_render_group.cpp: Introduce PushQuad()
31:55handmade_render_group.cpp: Clean up compile errors
31:55handmade_render_group.cpp: Clean up compile errors
31:55handmade_render_group.cpp: Clean up compile errors
34:16Run the game to see textured cubes and note that we must bind some texture to the sampler
34:16Run the game to see textured cubes and note that we must bind some texture to the sampler
34:16Run the game to see textured cubes and note that we must bind some texture to the sampler
37:11Consider creating a permanently resident plain white asset
37:11Consider creating a permanently resident plain white asset
37:11Consider creating a permanently resident plain white asset
39:35handmade_opengl.cpp: Create a WhiteBitmap
39:35handmade_opengl.cpp: Create a WhiteBitmap
39:35handmade_opengl.cpp: Create a WhiteBitmap
46:30handmade_render_group.cpp: Introduce a version of PushCube() that takes the WhiteBitmap directly
46:30handmade_render_group.cpp: Introduce a version of PushCube() that takes the WhiteBitmap directly
46:30handmade_render_group.cpp: Introduce a version of PushCube() that takes the WhiteBitmap directly
48:55handmade_opengl.cpp: Initialise WhiteBitmap to 0xFFFFFFFF and run the game to admire the fanciness
48:55handmade_opengl.cpp: Initialise WhiteBitmap to 0xFFFFFFFF and run the game to admire the fanciness
48:55handmade_opengl.cpp: Initialise WhiteBitmap to 0xFFFFFFFF and run the game to admire the fanciness
49:56Investigate what's going on with that colouring
49:56Investigate what's going on with that colouring
49:56Investigate what's going on with that colouring
52:39Step in to OpenGLAllocateTexture() and inspect the Data
52:39Step in to OpenGLAllocateTexture() and inspect the Data
52:39Step in to OpenGLAllocateTexture() and inspect the Data
53:40handmade_opengl.cpp: Prevent OpenGLInit() from returning anything, and tweak the WhiteBitmap
53:40handmade_opengl.cpp: Prevent OpenGLInit() from returning anything, and tweak the WhiteBitmap
53:40handmade_opengl.cpp: Prevent OpenGLInit() from returning anything, and tweak the WhiteBitmap
56:00Run the game and investigate the hypothesis that it's the vertices of the cube, rather than our texture, that are broken
56:00Run the game and investigate the hypothesis that it's the vertices of the cube, rather than our texture, that are broken
56:00Run the game and investigate the hypothesis that it's the vertices of the cube, rather than our texture, that are broken
1:02:56handmade_opengl.cpp: Prevent OpenGLAllocateTexture() from doing linear filtering, and run the game to see that this looks correct
1:02:56handmade_opengl.cpp: Prevent OpenGLAllocateTexture() from doing linear filtering, and run the game to see that this looks correct
1:02:56handmade_opengl.cpp: Prevent OpenGLAllocateTexture() from doing linear filtering, and run the game to see that this looks correct
1:04:45Consult the documentation on glTexParameter1
1:04:45Consult the documentation on glTexParameter1
1:04:45Consult the documentation on glTexParameter1
1:05:08handmade_opengl.cpp: Make OpenGLAllocateTexture() use GL_CLAMP_TO_EDGE
1:05:08handmade_opengl.cpp: Make OpenGLAllocateTexture() use GL_CLAMP_TO_EDGE
1:05:08handmade_opengl.cpp: Make OpenGLAllocateTexture() use GL_CLAMP_TO_EDGE
1:05:55Run the game to see that this also looks correct
1:05:55Run the game to see that this also looks correct
1:05:55Run the game to see that this also looks correct
1:07:05Consult the OpenGL 4.52 and 2.03 documentation on CLAMP
1:07:05Consult the OpenGL 4.52 and 2.03 documentation on CLAMP
1:07:05Consult the OpenGL 4.52 and 2.03 documentation on CLAMP
1:09:38Run the game and determine that we're drawing what we expect to draw
1:09:38Run the game and determine that we're drawing what we expect to draw
1:09:38Run the game and determine that we're drawing what we expect to draw
1:10:07handmade_opengl.cpp: Ensure that sRGB is being correctly passed through the pipeline
1:10:07handmade_opengl.cpp: Ensure that sRGB is being correctly passed through the pipeline
1:10:07handmade_opengl.cpp: Ensure that sRGB is being correctly passed through the pipeline
1:15:23handmade_render_group.h: Remove bitmap and rectangle from render_entry_group_type
1:15:23handmade_render_group.h: Remove bitmap and rectangle from render_entry_group_type
1:15:23handmade_render_group.h: Remove bitmap and rectangle from render_entry_group_type
1:15:55handmade_render_group.cpp: Enable PushRect() to push on to the CurrentQuads array
1:15:55handmade_render_group.cpp: Enable PushRect() to push on to the CurrentQuads array
1:15:55handmade_render_group.cpp: Enable PushRect() to push on to the CurrentQuads array
1:22:14Run the game, note that everything is going through the new path and inspect the QuadCount
1:22:14Run the game, note that everything is going through the new path and inspect the QuadCount
1:22:14Run the game, note that everything is going through the new path and inspect the QuadCount
1:23:16A few words on why this is an improvement
1:23:16A few words on why this is an improvement
1:23:16A few words on why this is an improvement
1:25:20handmade_opengl.cpp: Force a call to OpenGLRectangle(), step into it and inspect the assembly
1:25:20handmade_opengl.cpp: Force a call to OpenGLRectangle(), step into it and inspect the assembly
1:25:20handmade_opengl.cpp: Force a call to OpenGLRectangle(), step into it and inspect the assembly
1:28:56A few words on going fully bindless in order to do this in bulk completely
1:28:56A few words on going fully bindless in order to do this in bulk completely
1:28:56A few words on going fully bindless in order to do this in bulk completely
1:34:55Consult the documentation on glDrawArrays4 and glVertexAttribPointer5
1:34:55Consult the documentation on glDrawArrays4 and glVertexAttribPointer5
1:34:55Consult the documentation on glDrawArrays4 and glVertexAttribPointer5
1:40:47handmade_opengl.cpp: Enable OpenGLRenderCommands() to setup arrays for the texcoord, color and position
1:40:47handmade_opengl.cpp: Enable OpenGLRenderCommands() to setup arrays for the texcoord, color and position
1:40:47handmade_opengl.cpp: Enable OpenGLRenderCommands() to setup arrays for the texcoord, color and position
1:45:32Blackboard: Striding through our vertex array
1:45:32Blackboard: Striding through our vertex array
1:45:32Blackboard: Striding through our vertex array
1:47:03handmade_opengl.cpp: Continue working on OpenGLRenderCommands()
1:47:03handmade_opengl.cpp: Continue working on OpenGLRenderCommands()
1:47:03handmade_opengl.cpp: Continue working on OpenGLRenderCommands()
1:51:09Consult the documentation on glGetAttribLocation6
1:51:09Consult the documentation on glGetAttribLocation6
1:51:09Consult the documentation on glGetAttribLocation6
1:52:14handmade_opengl.cpp: Make OpenGLInit() allow us to specify the vertices to pass to the shader
1:52:14handmade_opengl.cpp: Make OpenGLInit() allow us to specify the vertices to pass to the shader
1:52:14handmade_opengl.cpp: Make OpenGLInit() allow us to specify the vertices to pass to the shader
1:56:42handmade_opengl.cpp: Make OpenGLRenderCommands() call glDrawArrays()
1:56:42handmade_opengl.cpp: Make OpenGLRenderCommands() call glDrawArrays()
1:56:42handmade_opengl.cpp: Make OpenGLRenderCommands() call glDrawArrays()
1:59:18handmade_opengl.cpp: Make OpenGLRenderCommands() pass the vertices directly to the shader program
1:59:18handmade_opengl.cpp: Make OpenGLRenderCommands() pass the vertices directly to the shader program
1:59:18handmade_opengl.cpp: Make OpenGLRenderCommands() pass the vertices directly to the shader program
2:02:25win32_handmade.cpp: Pull in the necessary functions from glcorearb.h7
2:02:25win32_handmade.cpp: Pull in the necessary functions from glcorearb.h7
2:02:25win32_handmade.cpp: Pull in the necessary functions from glcorearb.h7
2:07:27Run the game to admire the loveliness and investigate it
2:07:27Run the game to admire the loveliness and investigate it
2:07:27Run the game to admire the loveliness and investigate it
2:08:08handmade_opengl.cpp: Make OpenGLRenderCommands() correctly loop through the vertices and run the game to see that we're getting close
2:08:08handmade_opengl.cpp: Make OpenGLRenderCommands() correctly loop through the vertices and run the game to see that we're getting close
2:08:08handmade_opengl.cpp: Make OpenGLRenderCommands() correctly loop through the vertices and run the game to see that we're getting close
2:08:37handmade_opengl.cpp: Make OpenGLInit() set the correct VertUVID
2:08:37handmade_opengl.cpp: Make OpenGLInit() set the correct VertUVID
2:08:37handmade_opengl.cpp: Make OpenGLInit() set the correct VertUVID
2:09:42Run the game and note that we're in a good place, using fewer OpenGL calls
2:09:42Run the game and note that we're in a good place, using fewer OpenGL calls
2:09:42Run the game and note that we're in a good place, using fewer OpenGL calls
2:12:18Q&A
🗩
2:12:18Q&A
🗩
2:12:18Q&A
🗩
2:12:50kim_jorgensen Would it be better to expose an OpenGLGetProcAddress method in the platform layer and do the lookups in the handmade_opengl layer?
🗪
2:12:50kim_jorgensen Would it be better to expose an OpenGLGetProcAddress method in the platform layer and do the lookups in the handmade_opengl layer?
🗪
2:12:50kim_jorgensen Would it be better to expose an OpenGLGetProcAddress method in the platform layer and do the lookups in the handmade_opengl layer?
🗪
2:14:22vaualbus We will use VBO and IBO? In that case you prefer using glBufferData to send TGE data into the buffer or using glMapBuffer / glUnmapBuffer to send the data?
🗪
2:14:22vaualbus We will use VBO and IBO? In that case you prefer using glBufferData to send TGE data into the buffer or using glMapBuffer / glUnmapBuffer to send the data?
🗪
2:14:22vaualbus We will use VBO and IBO? In that case you prefer using glBufferData to send TGE data into the buffer or using glMapBuffer / glUnmapBuffer to send the data?
🗪
2:17:30robrobby Will you use 4coder in full window mode (4ed.exe -F) in the future?
🗪
2:17:30robrobby Will you use 4coder in full window mode (4ed.exe -F) in the future?
🗪
2:17:30robrobby Will you use 4coder in full window mode (4ed.exe -F) in the future?
🗪
2:18:16macielda By moving the construction of the vertex array to the RenderGroup, we kind of miss the opportunity of writing the quads directly into driver-owned memory, e.g. glMapBuffer. Is that statement correct? If so, is that a problem?
🗪
2:18:16macielda By moving the construction of the vertex array to the RenderGroup, we kind of miss the opportunity of writing the quads directly into driver-owned memory, e.g. glMapBuffer. Is that statement correct? If so, is that a problem?
🗪
2:18:16macielda By moving the construction of the vertex array to the RenderGroup, we kind of miss the opportunity of writing the quads directly into driver-owned memory, e.g. glMapBuffer. Is that statement correct? If so, is that a problem?
🗪
2:20:08kim_jorgensen Couldn't OpenGLGetProcAddress just return the method directly on some platforms, using string lookup?
🗪
2:20:08kim_jorgensen Couldn't OpenGLGetProcAddress just return the method directly on some platforms, using string lookup?
🗪
2:20:08kim_jorgensen Couldn't OpenGLGetProcAddress just return the method directly on some platforms, using string lookup?
🗪
2:21:36jessem3y3r Why not build one massive vertex buffer and just draw that once?
🗪
2:21:36jessem3y3r Why not build one massive vertex buffer and just draw that once?
🗪
2:21:36jessem3y3r Why not build one massive vertex buffer and just draw that once?
🗪
2:23:51jessem3y3r I see, thanks! Any chance we can see a render callstack from nsight or renderdoc just to see what the driver has to work through?
🗪
2:23:51jessem3y3r I see, thanks! Any chance we can see a render callstack from nsight or renderdoc just to see what the driver has to work through?
🗪
2:23:51jessem3y3r I see, thanks! Any chance we can see a render callstack from nsight or renderdoc just to see what the driver has to work through?
🗪
2:24:24Install RenderDoc8
2:24:24Install RenderDoc8
2:24:24Install RenderDoc8
2:26:04Run the game in RenderDoc
2:26:04Run the game in RenderDoc
2:26:04Run the game in RenderDoc
2:27:57jessem3y3r Press F12 to capture
🗪
2:27:57jessem3y3r Press F12 to capture
🗪
2:27:57jessem3y3r Press F12 to capture
🗪
2:29:47macielda Does the Debug UI still work? If so, how does one activate it?
🗪
2:29:47macielda Does the Debug UI still work? If so, how does one activate it?
🗪
2:29:47macielda Does the Debug UI still work? If so, how does one activate it?
🗪
2:30:08Jim0_o Have you set a version target for the pipeline? Will you go full Embedded Systems bananas (OpenGL ES)?
🗪
2:30:08Jim0_o Have you set a version target for the pipeline? Will you go full Embedded Systems bananas (OpenGL ES)?
🗪
2:30:08Jim0_o Have you set a version target for the pipeline? Will you go full Embedded Systems bananas (OpenGL ES)?
🗪
2:30:30Close it down with a glimpse into the future
🗩
2:30:30Close it down with a glimpse into the future
🗩
2:30:30Close it down with a glimpse into the future
🗩