一、开场:黑屏的「迷思」
在实时渲染开发中,一个常见的现象让不少初学者感到困惑:当 G-Buffer 填充失败、光照 Pass 报错、或某个 RenderPass 抛出异常时,屏幕上呈现的往往是纯黑一片,而不是「卡住」在上一帧的画面上。
从直觉上讲,上一帧的画面还在显存里,为什么显示器不能继续显示它?
这个问题看似简单,实际涉及图形 API、GPU 驱动、操作系统、显示器四层栈的协作。任何一层的异常都可能导致黑屏。
本文从 G-Buffer 到 SwapChain 完整剖析这条数据链,给出清晰的答案。
二、关键概念:BackBuffer vs FrontBuffer
要理解黑屏,先理解两个术语:
2.1 BackBuffer(后缓冲)
- 位置:GPU 显存;
- 状态:当前帧正在被写入;
- 可见性:显示器看不到这块内存。
2.2 FrontBuffer(前缓冲)
- 位置:GPU 显存(部分实现合并到 BackBuffer);
- 状态:当前正在被显示器扫描显示;
- 可见性:显示器正在看这块内存。