延迟渲染 vs 前向渲染 + early-z
Deferred render vs forward render + early-z
如果是前向渲染,那么FS执行的次数是(numberOfAllPixels * numberOfLights),如果是延迟渲染,那么FS执行的次数是(numberOfVisiblePixels * numberOfLights)。
所以如果我在前向渲染中加上early-z,那么FS执行的次数也变成了(numberOfVisiblePixels * numberOfLights),难道延迟渲染没有优势吗?
在前向渲染中,你必须re-render整个场景很多次。在延迟渲染中,您只渲染一次场景,仅此而已。
Re-rendering整个场景意味着re-doing一堆作品,包括但不限于:
- CPU场景处理。也就是遍历场景图,发出渲染命令。
- GPU 处理绘图命令之间的状态变化..
- GPU 读取网格的顶点数组。
- 顶点着色器执行。
所有这些在延迟渲染中只需发生一次。
并且不要忘记“early-z”不是免费的。不仅必须生成这些三角形,而且还必须对其进行光栅化。它们必须深入到处理管道中才能被剔除。这不是什么大不了的事,但也不是什么都没有。
所以是的,前向渲染的深度 pre-pass 意味着您只有在绝对必要时才 运行 FS。但你仍然是 运行 一堆不必要的东西。
如果是前向渲染,那么FS执行的次数是(numberOfAllPixels * numberOfLights),如果是延迟渲染,那么FS执行的次数是(numberOfVisiblePixels * numberOfLights)。
所以如果我在前向渲染中加上early-z,那么FS执行的次数也变成了(numberOfVisiblePixels * numberOfLights),难道延迟渲染没有优势吗?
在前向渲染中,你必须re-render整个场景很多次。在延迟渲染中,您只渲染一次场景,仅此而已。
Re-rendering整个场景意味着re-doing一堆作品,包括但不限于:
- CPU场景处理。也就是遍历场景图,发出渲染命令。
- GPU 处理绘图命令之间的状态变化..
- GPU 读取网格的顶点数组。
- 顶点着色器执行。
所有这些在延迟渲染中只需发生一次。
并且不要忘记“early-z”不是免费的。不仅必须生成这些三角形,而且还必须对其进行光栅化。它们必须深入到处理管道中才能被剔除。这不是什么大不了的事,但也不是什么都没有。
所以是的,前向渲染的深度 pre-pass 意味着您只有在绝对必要时才 运行 FS。但你仍然是 运行 一堆不必要的东西。