CsPaint  1.0.2
Graphics Terminology

Vulkan Terminology

Instance
Connection between your application and the Vulkan library
Typically your application will only create one
Every other Vulkan call relies on passing this instance or some data associated with this instance
Context
Vulkan instance is similar to an OpenGL context
Context is not a term used in the Vulkan API
Surface
A term for the window region where images are rendered
Native window support is not handled directly in the API, it is implemented in platform extensions
Memory Heap
Provides storage for buffers which will be accessed by the GPU
Every buffer must be created and managed by the user
Memory is allocated from a memory heap
The buffer is then bound to the allocated memory
Any memory which is visible to the GPU will be in the list of all memory heaps
There are usually multiple heaps available
Certain heaps can only be used for specific types of buffers
Vertex Buffer
Coordinates of all vertices which describes the geometry for the image being rendered
Triangles are the most widely used shape
There can be as few as three vertices, typically thousands for a given image
Uniform Buffer
Contains data which is applied to every vertex
For example, transformations can be used to shift the geometry and render the image somewhere other than the center
Vertex Shader
Transforms a 3D position into 2D coordinates
Executes once per vertex
Tessellation Shader
Decomposes shapes into smaller components, optional shader
Geometry Shader
Alters the vertex shader output, optional shader
Fragment Shader
uses lighting and textures to calculate colors
executes at least once per pixel or fragment (partial pixel)
Pipeline
Before a draw command is added to a command buffer you must create a pipeline object which sets a whole lot of options
Shader handles, descriptor sets, push constants, depth buffer
Winding direction, culling options, viewport
Stencil, scissor, blending
Command Buffer
Accumulates draw commands which are executed on the GPU at a later time
Only way to synchronize these commands is by using a barrier
  • Set semaphore, query semaphore
  • Wait for pipeline stage (such as wait for a vertex shader to finish)
Frame Buffer
Typically contains one image
No default buffer exists since displaying an image is optional
A frame buffer us not required if no images are displayed
Depth Buffer
A 3D mesh has perspective and to draw it realistically some triangles must appear in front of other triangles
A depth buffer is used to determine what part of the mesh is closer to the camera
Misconfiguring this buffer will result in far away objects being rendered on top of closer objects
Render Pass
Added for improved performance on mobile
  • OpenGL and DirectX 12 do not have a render pass equivalent
For tile based GPU support
  • common in mobile, uncommon on desktop computers
A pipeline needs information about color channels, the depth buffer, possible image sampling, etc
All of this information is split into one or more render passes
begin command buffer, begin render pass
add commands for this one pass
end render pass, end command buffer
Swapchain
A set of buffers where the GPU can render
In Vulkan there is no default frame buffer
Creating a swapchain is the only way to create an empty frame buffer
Each frame buffer will hold a single image which is waiting to be presented on the surface
A single swap chain can contain many frame buffers
Platform specific, supplied through “extensions” which are requested when you create the Vulkan instance
Graphics Queue
Used to generate an image
Present Queue
Used to copy images to the screen
Computation Queue
Used to run general purpose computations
Transfer Queue
Used to copy data between CPU memory and GPU memory
Fence
Used to synchronize work between the CPU and the GPU
Status of a fence can be accessed from your program
Semaphore
Used to synchronize work occurring on the GPU
Semaphore dependencies are set up in your program however they are observed only on the GPU
Not visible to the CPU nor can you query their status
Winding Direction
Must be specified as part of the pipeline
Conventionally clockwise winding is used
The direction is used to determine whether a given triangle is facing the camera (front facing) or facing away (back facing)
Back Face Culling
Is the process of discarding triangles which are back facing since these are not normally visible to the viewer
There is no default so it must be set on or off in the pipeline
Triangles are "culled" early in the rendering pipeline
Increases efficiency by reducing the number of fragments which are processed
Push Constants
A way to provide a small amount of uniform data to shaders
Scissor
Scissor test restricts drawing to the specified rectangle
Test is always enabled and can not be turned off
Extent
Structure containing width and height
Defines things like the size of the screen or the render area
Viewport
Specifies a region of the frame buffer which should be refreshed, potentially complicated to determine