Wikipedia, in my opinion, provides a good explanation of the differences.
https://en.wikipedia.org/wiki/Multiple_buffering#Double_buffering_in_computer_graphics
The article describes the following buffer techniques for computer graphics:
- Software Double-Buffering
- Page Flipping
Wikipedia
Software Double-Buffering uses system RAM as a frame buffer and copies the contents over to Video or Graphics RAM.
A software implementation of double buffering has all drawing operations store their results in some region of system RAM; any such region is often called a "back buffer". When all drawing operations are considered complete, the whole region (or only the changed portion) is copied into the video RAM (the "front buffer"); this copying is usually synchronized with the monitor's raster beam in order to avoid tearing. Software implementations of double buffering necessarily requires more memory and CPU time than single buffering because of the system memory allocated for the back buffer, the time for the copy operation, and the time waiting for synchronization.
Page flipping utilizes two buffers directly in Video or Graphics RAM.
At any one time, one buffer is actively being displayed by the monitor, while the other, background buffer is being drawn. When the background buffer is complete, the roles of the two are switched. The page-flip is typically accomplished by modifying a hardware register in the video display controller—the value of a pointer to the beginning of the display data in the video memory.
Intel GPU's
Another thing to note is that not all GPU's have dedicated Video RAM or VRAM. For instance, Intel Graphics controllers do not have dedicated Video RAM.
https://www.intel.com/content/www/us/en/support/articles/000041253/graphics.html
The Graphics Processing Unit (GPU) does not have a dedicated memory; it uses shared memory that will be allocated automatically depending on various factors.
More resources from Intel for FPGA's
For double-buffering, the Frame Buffer II IP core uses two frame buffers in external RAM.
The writer uses one buffer to store input pixels. The reader locks the
second buffer that reads the output pixels from the memory. When both
writer and reader complete processing a frame, the buffers are
exchanged. The input frame can then be read back from the memory and
sent to the output, while the buffer that has just been used to create
the output can be overwritten with fresh input.
For triple-buffering, the IP core uses three frame buffers in external RAM.
The writer uses one buffer to store input pixels. The reader locks the
second buffer that reads the output pixels from the memory. The third
buffer is a spare buffer that allows the input and the output sides to
swap buffers asynchronously. The spare buffer can be clean or dirty.
Considered clean if it contains a fresh frame that has not been sent.
Considered dirty if it contains an old frame that has already been
sent by the reader component. When the writer completes storing a
frame in memory, it swaps its buffer with the spare buffer if the
spare buffer is dirty.
The buffer locked by the writer becomes the new spare buffer and is
clean because it contains a fresh frame. If the spare buffer is
already clean when the writer completes writing the current input
frame: If dropping frames is allowed—the writer drops the newly
received frame and overwrites its buffer with the next incoming frame.
If dropping frames is not allowed—the writer stalls until the reader
completes its frame and replaces the spare buffer with a dirty buffer.
When the reader completes reading and produces a frame from memory, it
swaps its buffer with the spare buffer if the spare buffer is clean.
The buffer locked by the reader becomes the new spare buffer; and is
dirty because it contains an old frame that has been sent previously.
If the spare buffer is already dirty when the reader completes the
current output frame: If repeating frames is allowed—the reader
immediately repeats the frame that has just been sent. If repeating
frames is not allowed—the reader stalls until the writer completes its
frame and replaces the spare buffer with a clean buffer.
Another resource from Cornell
Double buffering, aka ping-pong buffering, is a technique to simplify programming when multiple operations are applied to the same image in succession.
We have buffers.
At any time, one buffer is the write buffer and the other is the read buffer.
The operation you can perform on the buffer is as indicated by the name.
You can only read from the read buffer, and you can only write from the write buffer.
We can swap the buffer to exchange their roles.