Vulkan & OpenGL Differences
When setting up a shaded triangle, Vulkan offers several features and concepts that are either absent or significantly different from OpenGL. Here are some key differences:
1. Explicit Control
2. Command Buffers
3. Multiple Queues
4. Pipeline Creation
5. Synchronization
6. Resource Binding
7. Shader Modules
8. Render Passes
Summary
+--------------------------------------+
| OpenGL Application |
| (Setup and Initialization) |
+--------------------------------------+
|
v
+--------------------------------------+
| Create Shader Program |
| GLuint shaderProgram = glCreateProgram(); |
| glAttachShader(shaderProgram, vertexShader); |
| glAttachShader(shaderProgram, fragmentShader); |
| glLinkProgram(shaderProgram); |
+--------------------------------------+
|
v
+--------------------------------------+
| Setup Vertex Array Object |
| GLuint VAO; |
| glGenVertexArrays(1, &VAO); |
| glBindVertexArray(VAO); |
| glGenBuffers(1, &VBO); |
| glBindBuffer(GL_ARRAY_BUFFER, VBO); |
| glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); |
| glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); |
| glEnableVertexAttribArray(0); |
+--------------------------------------+
|
v
+--------------------------------------+
| Draw Call |
| glUseProgram(shaderProgram); |
| glBindVertexArray(VAO); |
| glDrawArrays(GL_TRIANGLES, 0, 3);|
+--------------------------------------+
|
v
+--------------------------------------+
| Framebuffer |
| SwapBuffers(window); |
+--------------------------------------+
+--------------------------------------+
| Vulkan Application |
| (Setup and Initialization) |
+--------------------------------------+
|
v
+--------------------------------------+
| Create Instance |
| vkCreateInstance(&instanceInfo, &instance); |
+--------------------------------------+
|
v
+--------------------------------------+
| Create Device |
| vkCreateDevice(instance, &deviceCreateInfo, &device); |
+--------------------------------------+
|
v
+--------------------------------------+
| Create Shader Modules |
| vkCreateShaderModule(device, &vertShaderInfo, &vertShaderModule); |
| vkCreateShaderModule(device, &fragShaderInfo, &fragShaderModule); |
+--------------------------------------+
|
v
+--------------------------------------+
| Create Graphics Pipeline |
| vkCreateGraphicsPipelines(device, &pipelineInfo, &pipeline); |
+--------------------------------------+
|
v
+--------------------------------------+
| Create Vertex Buffer |
| vkCreateBuffer(device, &bufferCreateInfo, &vertexBuffer); |
| vkBindBufferMemory(device, vertexBuffer, vertexBufferMemory); |
+--------------------------------------+
|
v
+--------------------------------------+
| Allocate Command Buffer |
| vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer); |
+--------------------------------------+
|
v
+--------------------------------------+
| Record Command Buffer |
| vkBeginCommandBuffer(commandBuffer, &beginInfo); |
| vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); |
| vkCmdBindVertexBuffers(commandBuffer, 0, 1, &vertexBuffer, offsets); |
| vkCmdDraw(commandBuffer, 3, 1, 0, 0); |
| vkEndCommandBuffer(commandBuffer); |
+--------------------------------------+
|
v
+--------------------------------------+
| Submit Command Buffer |
| vkQueueSubmit(graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE); |
+--------------------------------------+
|
v
+--------------------------------------+
| Render Pass |
| vkBeginRenderPass(commandBuffer, &renderPassInfo); |
+--------------------------------------+
|
v
+--------------------------------------+
| Framebuffer |
| vkEndRenderPass(commandBuffer); |
| vkQueuePresentKHR(presentQueue, &presentInfo); |
+--------------------------------------+