是他们的替代模板通行证

问题描述:

目前我已经使用OpenGL实现了延迟渲染,它现在相当简单。但是,由于目前使用模板通道(至少按照我目前的使用方式),我遇到了主要的性能问题。我主要使用ogldev.atspace教程(每个帖子只有2个链接,对不起!)作为参考,还有其他文章中的几十条信息。是他们的替代模板通行证

它是这样工作:

  1. Gbuffer通(渲染几何体和填充法线,弥漫性,环境等)
  2. 对于每个光 2a)的模版传 2b)的光通过
  3. 交换到屏幕

事情是用这种方式使用模板通是招致巨大的成本,因为我需要在光通模式和模板模式之间交换fo在场景中的每一盏灯。所以这是很多GL状态掉期。

没有模板通的另一种方法是这样的:

  1. Gbuffer填写
  2. 集光传递
  3. 计算所有灯光
  4. 交换到屏幕

做这就忽略了为场景中的每个灯交换所有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

1模板版本(它应该如何看): http://imgur.com/kVGRwH2

所以我主要问题是,是否有一种方法可以避免使用模板传递(并且在没有图形故障的情况下使用与第一种相似的东西),而不将算法完全更改为像平铺延迟渲染之类的东西?

如果不是,他们是替代延期渲染方法,这是不是从我使用的延迟渲染器的风格跳过太多?

摆脱模具通行证对我来说不是一个新问题,我在6个月左右的时间里寻找替代方案,当我第一次实施时,认为它可能有点太高为了我的想法。但我当时找不到任何东西,但仍然无法找到。

+2

作为一个旁注,你应该考虑一下你的帧时间,而不是FPS。 FPS不是线性测量。 –

另一个tecnique至极被毁灭战士用于照明如下:

http://fabiensanglard.net/doom3/renderer.php

For each light 
    render the geometry affected only by 1 light 
    accumulate the light result (clamping to 255) 

至于优化,你可以添加一个剪刀的测试,这样你就只渲染的几何图形的可见部分每个灯。

与模板灯相比,它的优势在于,您可以根据需要进行复杂的光线计算,或者保持简单的灯光。整个工作是GPU,你没有多余的状态变化(你只设置了1个着色器,仅设置了1个vbo,并且每次只改变灯光和剪刀测试区域的统一参数)。你甚至不需要G-Buffer。