首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glColorMask()/glDepthMask()在现代硬件上的性能增益?

glColorMask()/glDepthMask()在现代硬件上的性能增益?
EN

Stack Overflow用户
提问于 2017-11-16 10:23:48
回答 1查看 686关注 0票数 3

在我的应用程序中,我有一些着色器,它们只编写深度缓冲区,以便稍后使用它进行阴影处理。此外,我有一些其他的着色器,它呈现一个全屏四边形,其深度不会影响所有后续的绘图调用,因此它的深度值可能会被丢弃。

假设应用程序运行在现代硬件上(5年前生产到现在),如果我禁用阴影地图着色器的彩色缓冲区写入(glColorMask(all to GL_FALSE))和全屏幕四色着色器的深度缓冲区写入(与glDepthMask()),我会获得额外的性能吗?

换句话说,这些函数是否真的禁用了一些内存操作,或者只是修改了一些掩码位,这些掩码位在呈现管道这一部分的固定位操作逻辑中使用?

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

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

最后,如果呈现在深度/颜色测试/写入禁用的情况下运行得更快,那么它运行的速度有多快?这样的性能增益不会被gl函数调用开销所抵消吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 15:19:33

你的问题遗漏了一件非常重要的事情:你必须做些什么。

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

  1. 该颜色通过glDrawBuffers路由到颜色缓冲区。
  2. 有一个适当的颜色/深度缓冲区附加到FBO。
  3. 颜色/深度写入掩码允许它被写入。

所以如果你不想写其中一种颜色或者深度缓冲区,你就必须这样做。更改#1或#2是FBO状态更改,这是您可以在OpenGL中执行的最重量级操作之一。因此,您的选择是进行FBO更改或更改写入掩码。后者将永远是性能更友好的操作.

在您的情况下,您的应用程序对GPU或CPU的压力不够大,不足以满足这种更改的需要。但是总的来说,改变写口罩比玩FBO更好。

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

你是同时改变其他状态,还是你唯一感兴趣的状态?

查看这类先验性能问题的一个好方法是查看Vulkan或D3D12,看看它在该API中需要什么。改变任何管道状态都是一件大事。但是,改变两种状态并不比一笔交易更大。

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

同时,如果您真的非常关心性能问题,那么您应该进行应用程序测试。在您实现这一功能之后,以及在所有感兴趣的硬件上,这种情况应该会发生。而且您的代码应该足够灵活,可以根据需要轻松地从一个切换到另一个。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47327141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档