提高OpenGL渲染的性能:从不同的POV渲染多次

时间:2014-07-08 17:04:02

标签: c++ opengl

我正在开发一个需要从多个角度渲染场景的应用程序。我注意到,如果我渲染一次,即使碎片着色器很长而且很复杂(写入多个3D纹理),它的运行速度为65 FPS。一旦我在此之前添加另一个渲染过程(简单渲染到2个目标,颜色和法线+深度),帧速率就会下降到40.如果我添加一个阴影贴图,它会进一步下降到25-30 FPS。处理多个渲染并保持高帧率的最佳方法是什么?

现在我有1个着色器用于执行普通+深度贴图和阴影贴图,1个着色器用于写入3d纹理,1个着色器用于通过读取所有贴图进行最终渲染。如果我只运行最后一个着色器(因此读取nomral + depth和shadowmap的乱码值)它以65 FPS运行(并且计算只是一系列操作,没有循环或条件)。

2 个答案:

答案 0 :(得分:2)

测量FPS可能会产生误导。 65 FPS对应于每帧15ms而40 FPS对应于每帧25ms。 30 FPS对应每帧33ms。

因此,复杂的着色器单独需要15ms,复杂的着色器加上切换渲染以及切换着色器以及执行第二次渲染过程的实际处理需要额外的10ms。这一点并不差,正常/深度着色器减少了1/3的时间,这几乎是"正如预期的那样#34;。阴影贴图再添加8毫秒。

除非你有明显的管道停顿,否则渲染现在首先受到ROP的限制,这意味着除了你接触的像素越多,其所需的时间就越多,按比例增加。

当然,15ms已经是一个相当沉重的帧时间,除非场景大量,你应该确保你没有很多因为着色器和纹理变化而导致的停顿(这会打破批次),你应该确保你不会因为缓冲同步而失速。

尝试批处理一起绘制调用,并确保避免状态更改。这将确保GPU不会在两者之间闲置。国家变化的成本按重要性递减顺序排列(Cass Everitt提供):

  1. 渲染目标
  2. 着色
  3. ROP
  4. 纹理
  5. 顶点格式
  6. UBO /顶点缓冲区绑定
  7. 统一更新
  8. 您似乎无法避免渲染目标更改(因为您有两个),但实际上您可以同时渲染到两个目标。按着色器排序(在按纹理或其他东西排序之前)可以避免那些状态变化等等。

答案 1 :(得分:1)

复制要在几何着色器中渲染的几何体,并执行所需的任何变换。您只需要以这种方式进行一次渲染。

更多信息:http://www.geeks3d.com/20111117/simple-introduction-to-geometry-shader-in-glsl-part-2/