【发布时间】:2023-03-30 04:45:01
【问题描述】:
我目前正在使用 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/…)。