为了避免动画中的闪烁,最好将整个动画帧绘制到称为后台缓冲区的屏幕外纹理(off-screen texture)中。一旦整个场景被绘制到给定动画帧的后缓冲区,它就作为一个完整的帧呈现给屏幕;以这种方式,观看者不会在绘制帧时观看到 - 观看者只能看到完整的帧。为实现这一点,硬件维护两个纹理缓冲区(texture buffers),一个称为前缓冲区(front buffer),另一个称为后缓冲区(back buffer)。前缓冲区存储当前正在监视器上显示的图像数据,而下一帧动画正被绘制到后缓冲区。在将帧绘制到后台缓冲区后,后台缓冲区和前台缓冲区的角色对调:后台缓冲区成为前台缓冲区,前台缓冲区成为下一帧动画的后台缓冲区。交换后台和前台缓冲区的角色称为呈现(presenting)。呈现是一种高效的操作,因为只需要交换指向当前前缓冲区的指针和指向当前后缓冲区的指针。图4.1说明了该过程。

【D3D12学习手记】The Swap Chain and Page Flipping-LMLPHP

图4.1。 对于第n桢,当前是缓冲区A正在被显示,下一帧将被渲染到缓冲区B,缓冲区B用作当前后台缓冲区。 帧绘制完成后,交换指针,缓冲区B成为前缓冲区,缓冲区A成为新的后台缓冲区。 然后我们将下一帧n + 1渲染到BufferA。 帧完成后,交换指针,缓冲区A成为前缓冲区,缓冲区B再次成为后台缓冲区。

前后缓冲区形成交换链(a swap chain)。 在Direct3D中,交换链由IDXGISwapChain接口表示。 此接口存储前后缓冲区纹理(the front and back buffer textures),并提供调整缓冲区大小(IDXGISwapChain :: ResizeBuffers)和呈现(IDXGISwapChain :: Present)的方法。
使用两个缓冲区(前缓冲区和后缓冲区)称为双重缓冲。 可以使用两个以上的缓冲区; 使用三个缓冲区称为三重缓冲。 但是,两个缓冲区通常就足够了。

  

旁注:即使后缓冲区是纹理(a texture)(因此元素应该称为纹素),但我们经常将元素称为像素,因为在后缓冲区的情况下,它存储颜色信息(in the case of the back buffer, it stores color information这句不懂)。 有时人们会将纹理元素称为像素,即使它不存储颜色信息(例如,“法线贴图的像素”)。

05-15 20:56