目前我已经使用 OpenGL 实现了延迟渲染,它现在相当简单。但是,由于目前使用模板通道(至少以我目前使用它的方式),我遇到了主要的性能问题。我主要使用 ogldev.atspace 教程(抱歉,每个帖子只有 2 个链接!)作为参考以及其他文章中的几十条信息。
它的工作原理如下:
- Gbuffer pass(渲染几何和填充法线、漫反射、环境等)
- 对于每个灯 2a) 模板通道 2b) 灯通道
- 换屏
问题是以这种方式使用模板通道会产生巨大的成本,因为我需要为场景中的每个灯光在光通道模式和模板模式之间切换。所以这是很多 GL 状态交换。
没有模板通道的替代方法如下所示:
- Gbuffer 填充
- 设置光通
- 计算所有灯光
- 换屏
这样做无需为场景中的每个灯光交换所有 OpenGL 状态(和缓冲区清除等)。
我已经使用 CodeXL 和基本 fps 的 std::cout'ng 对此进行了测试/分析。使用模板传递方法的状态更改函数占用了我 GL 调用的 44%(相比之下,绘制为 6%,纹理为 6%),缓冲区交换/清除等也花费了相当多的 %。当我使用第二种方法时,GL 状态变化下降到 2.98%,其他的下降幅度也相当大。FPS 也发生了巨大变化,例如我的场景中有 65~ 个灯光,动态移动。如果我在发布模式下幸运的话,Stencil Pass 给我大约 20-30 fps(渲染占用了大部分时间)。第二种方法给了我 71~ (渲染占总时间的较小部分)。
现在为什么不直接使用第二种方法呢?好吧,它会导致严重的照明问题,这是我第一次没有得到的。我不知道如何摆脱它们。这是一个例子:
第二个非模板版本(它基本上会流血并重叠在其范围之外的东西上):http: //imgur.com/BNn9SP2
第一个模板版本(它应该看起来如何):http: //imgur.com/kVGRwH2
所以我的主要问题是,有没有办法避免使用模板通道(并使用类似于第一个没有图形故障的东西)而不将算法完全更改为平铺延迟渲染之类的东西?
如果不是,他们是否是另一种延迟渲染方法,这与我正在使用的延迟渲染器的风格没有太大的区别?
摆脱模板通行证对我来说并不是一个新问题,当我第一次实现它时,我正在寻找一个替代方案,大约 6 个月前,我认为这对于我所拥有的东西来说可能有点过多的开销心里。但我当时什么都找不到,现在仍然找不到。