现代硬件上glColorMask()/ glDepthMask()的性能提升?

时间:2017-11-16 10:23:48

标签: opengl depth-buffer

在我的应用程序中,我有一些着色器,它们只写入深度缓冲区,以便稍后用于阴影。此外,我还有一些其他着色器渲染全屏四边形,其深度不会影响所有后续绘制调用,因此它的深度值可能会被丢弃。

假设应用程序在现代硬件上运行(5年前到现在生产),如果我禁用阴影贴图着色器的颜色缓冲区写入(glColorMask(all to GL_FALSE))和深度缓冲区写入,我将获得任何额外的性能(使用{ {1}})全屏四字着色器?

换句话说,这些函数是否真的禁用了一些内存操作,或者它们只是改变了渲染管道的这部分中固定的按位运算逻辑中使用的一些掩码位?

关于测试的同样问题。如果我事先知道所有碎片都会通过深度测试,那么禁用深度测试会提高性能吗?

我的FPS测量没有显示任何显着差异,但结果可能在另一台机器上有所不同。

最后,如果渲染在深度/颜色测试/写入禁用的情况下运行得更快,它运行的速度会快多少? gl函数调用开销是否会抵消这种性能提升?

1 个答案:

答案 0 :(得分:3)

你的问题缺少一个非常重要的事情:你必须做某事

每个片段都有颜色和深度值。即使您的FS没有生成值,仍然会有值。因此,生成的每个未被丢弃的片段都会写入这些值,只要:

  1. 通过glDrawBuffers将颜色路由到颜色缓冲区。
  2. FBO附有适当的颜色/深度缓冲区。
  3. 可以写入颜色/深度写入掩码。
  4. 因此,如果您正在渲染并且您不想编写其中一种颜色或深度缓冲区,则必须执行其中一种操作。更改#1或#2是FBO状态更改,这是您可以在OpenGL中执行的最重量级操作之一。因此,您的选择是进行FBO更改或更改写掩码。后者将永远是对性能更友好的操作。

    也许在你的情况下,你的应用程序并没有足够强调GPU或CPU的重要性。但总的来说,改变写掩码比使用FBO更好。

      

    如果我事先知道所有碎片都会通过深度测试,那么禁用深度测试会提高性能吗?

    您是在同时更改其他州,还是您唯一感兴趣的州?

    查看这些先验性能问题的一个好方法是查看Vulkan或D3D12,看看那个 API需要什么。改变任何管道状态都有很大帮助。但改变两件国家并不是一件大事。

    因此,如果更改深度测试与更改其他状态(混合模式,着色器等)相关,则可能不会再受到伤害。

    同时,如果您真的对此类事情的性能足够关注,那么您应该进行应用程序测试。这应该在您实施之后以及所有感兴趣的硬件上实现。并且您的代码应该足够灵活,以便根据需要轻松地从一个切换到另一个。