gpt4 book ai didi

两个着色器之间频繁交换的 OpenGL 性能开销

转载 作者:行者123 更新时间:2023-12-03 16:53:07 26 4
gpt4 key购买 nike

我有两个特定的着色器:

第一个着色器从场景中的所有对象转换阴影并渲染为单个全屏 8 位阴影纹理。 glsl 代码很短。

第二个着色器在 g 缓冲区上执行延迟光照计算,并渲染到单个全屏 32 位纹理缓冲区。它使用多种全屏纹理(32 位位置、16 位法线、32 位漫反射、8 位高光、8 位阴影)。 glsl 代码也很冗长。

如您所见,对于每盏灯,这两个着色器必须依次执行。 A 然后 B,A 然后 B,A 然后 B。这导致大量交换。

我读到着色器交换有一些相对较高的开销,但我不熟悉 GPU 如何处理仅两个着色器之间的交换。

这两个着色器程序的缓存是否足够有效以至于这应该不是问题?

我应该结合这两个着色器并使用 glDrawBuffers() 引导输出吗?如果我组合它们,从前一个 g 缓冲区照明阶段加载的 5 个纹理将在下一个阴影转换阶段保持陈旧,这会导致任何性能开销吗?

最佳答案

Will the two shader programs be cached effectively enough that this shouldn't be a problem?

问题不在于缓存,而是更改着色器会刷新 GPU 执行管道。管道和分支预测器需要几十个时钟周期才能适应新切换到着色器。

Should I combine the two shaders and direct the output using glDrawBuffers()?

在延迟着色器设置中,您是否可以在没有太多问题的情况下做到这一点? 当然!

关于两个着色器之间频繁交换的 OpenGL 性能开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16096661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com