更快的全屏渲染(OpenGL/glsl)?

Posted

技术标签:

【中文标题】更快的全屏渲染(OpenGL/glsl)?【英文标题】:Faster fullscreen rendering (OpenGL/glsl)? 【发布时间】:2016-10-25 15:12:29 【问题描述】:

我目前正在使用 Opengl 3.3 编写一个具有大量全屏后处理的引擎(3 次,用于模糊阴影、灯光等)。

对于每个通道,我必须渲染覆盖整个屏幕的完全相同的 2 个三角形。并且必须一个一个地生成完全相同的片段,它们正是窗口的所有像素。

该引擎目前在 GeForce 570 上以令人满意的 200 FPS 运行,但在英特尔集成显卡上以 15 FPS 左右的速度挣扎。

如果我将窗口的分辨率减半并相应地调整纹理,它的运行速度大约会快 3 倍。所以它肯定是受 GPU 限制的,并且受到后处理量的限制。

对我来说,每秒生成完全相同的片段 600 次似乎很浪费。所以我的问题如下,OpenGL 3/4 中是否有专门为简化全屏渲染而设计的功能,例如通过告诉 OpenGL 他试图生成的片段只是屏幕的矩形并且没有猜测要做什么?

【问题讨论】:

如果调整窗口大小会产生加速,这意味着您受限于片段着色器。明确告诉 OpenGL 渲染到整个帧缓冲区只会忽略顶点处理,在全屏四边形的情况下,这是微不足道的。片段着色器仍然必须为帧缓冲区中的每个片段运行。您提议的扩展对您没有帮助。 片段着色器的内容已尽可能优化,因此我肯定会尝试在其他地方找到一些东西。在我看来,OpenGL 不可能猜到我正在做全屏渲染并加速它,而无需我专门使用一个功能来告诉它。如果将 1.0 更改为 0.999 并且必须留下一行像素怎么办?它不能做出任何假设,但我想要它。 我看不出 OpenGL 驱动程序会假设什么会对您有所帮助。正如我之前所说,转换和填充全屏四边形对于 GPU 来说是微不足道的。这不是您的瓶颈:优化它不会带来明显的性能优势。 @user3809646:光栅化设置,即确定要处理的基元的限制实际上非常便宜,而且就您的情况而言,收益为零。是什么拖累了您的帧速率,而片段着色器中发生的一切事情。只需将您当前的片段着色器替换为虚拟着色器(仅写入恒定颜色的着色器)并比较渲染时间。 一个小胜利(太小而无法保证答案,所以它只是一个评论)是使用一个覆盖整个屏幕的超大三角形而不是使用两个三角形。为那个额外的三角形节省的顶点处理与剪裁过大的单个三角形的成本完全无关。然而,摆脱对角线缝可以为一些 GPU 节省一些工作并提高它们的缓存效率,并且可以产生可衡量的收益(例如在 AMD 上:michaldrobot.com/2014/04/01/…)。 【参考方案1】:

OpenGL 3/4 中是否有专门为简化全屏渲染而设计的功能,例如告诉 OpenGL 他试图生成的片段只是屏幕的矩形,无需猜测?

不,没有。但即使有,也没关系。

在多级化学合成中,有“定速步骤”的概念。也就是说,如果你有一个 A 产生 B 的反应,以及一个 B 产生 C 的进一步反应,那么这些反应中的一个会比另一个慢(通常慢得多)。那是决定速率的步骤:整个过程永远不会比最慢的步骤快。

如果 A->B 需要 0.01 秒,而 B->C 需要 1 秒,那么整个过程将需要 1 秒。在 0.99 秒内,会有很多 B 坐在那里等着变成 C。所以,如果你找到一种方法让 A->B 花费 0.001 秒,这并不重要;如果你想要 C,仍然需要 1 秒才能得到它。

这里也一样。您想对场景进行后期处理。嗯,这需要大量的带宽和 FS 计算资源。处理 CPU 命令和生成三角形所花费的时间微不足道,仅次于带宽和 FS 时间。

因此,即使您可以稍微加快这个过程中已经很快速的部分,但这对您的整体表现毫无意义。这些命令只是坐在那里,等待带宽和 FS 资源可用。

【讨论】:

以上是关于更快的全屏渲染(OpenGL/glsl)?的主要内容,如果未能解决你的问题,请参考以下文章

使用立方体贴图(OpenGL/GLSL)的点光源是不是可以实现软阴影?

OpenGL/GLSL 颜色附件范围

用于片段着色器的 OpenGL GLSL 绑定采样器

Opengl/glsl 试图为绘制四边形编写着色器,但不确定如何处理屏幕纵横比的变化

片段着色器不会在 OpenGL GLSL 中创建像光一样的渐变

全兼容的全屏自适应布局