我通常应该在游戏的一帧中使用几个活动着色器?5个或更多,例如100个?


20

在现代游戏中,通常同​​时在一个场景中同时激活多少个着色器?我知道正在使用多个着色器,游戏在每一帧中在它们之间切换,通常通过着色器绘制对象:

  1. 使用着色器一绘制所有对象
  2. 从着色器一更改为着色器二
  3. 使用着色器2绘制所有对象

不过,我知道这并不是那么简单,尤其是对于整个场景的光晕效果,渲染到纹理等效果,但是我想我们可以假设它在大多数时间都可以正常工作,对吗?“按着色器分组”方法很好,因为切换着色器是一项昂贵的操作。

一方面,您不能有太多的着色器,因为您想快速渲染场景。另一方面,您需要用于皮肤,金属,水等的许多不同的着色器(或带有分支的超级着色器-非常相似)。

理论上的,现代的,第三人称3D PC侦探游戏(如果需要的话,是DirectX 11)将使用多少个(以及哪个)不同的着色器?在某个“帧X”处,将是5个,20个或更多(例如100个活动着色器),仅计算活动着色器吗?我知道这不是一个数字,但我想知道在考虑PC游戏时,什么规模和因素很重要。


在我的示例游戏中,我将每帧使用大约9-11(将其视为不同的小型着色器或一个超级着色器-现在不重要):

  1. 皮肤着色器
  2. 眼影器(不是太多吗?但它们是不同的)
  3. 金属着色器
  4. 地面着色器
  5. 雪/雨着色器(如果需要)
  6. 着色器(如果场景中存在水)
  7. 发光着色器(仅当涉及某些特殊效果时)
  8. 发光器着色器(路灯等)
  9. 标准着色器(对于所有其他着色器,仅是标准着色)
  10. 具有法线贴图的标准着色器
  11. 2D着色器(用于GUI等)

是“很多”还是“不是很多”?我是否忘记了一些我需要的重要着色器?

Answers:


28

这确实取决于技术。在前向渲染中,通常对于每种不同的材质类型都有一个着色器。在使用此技术的AAA游戏中,着色器通常是由艺术家可以设置的材质上的一组选项生成的。这可能导致数百个着色器(1)。但是可以说,着色器的数量通常在40个数量级

在延迟着色/渲染中,您经常在G缓冲区中编码材质类型,然后使用一个大的着色器以不同的方式正确渲染不同的材质类型。这导致更少但更复杂的着色器。可以说这里的着色器数量约为5。

(1)资料来源:我为Crystal Dynamics的承包商工作,在那里我建立了一个工具来减少古墓丽影(Tomb Raider)生成的着色器的数量,因为自动生成已经失控了;)。目标是将着色器的数量减少到40个左右。


2
谢谢您的回答-它非常复杂且丰富。我刚刚投票了。尽管如此,我还是要等几天后再进行评分,因为这是一个“开放”的问题-也许其他人也可以从自己的经验中获得更多补充。再次感谢Roy :)
PolGraphic 2014年

s / less / fewer / ...
错误

3

我知道您想要PC的答案。但是我会回答我在iOS中所做的事情,而且我不希望您打勾。

看来您有正确的主意。每个应用程序都会有所不同。最后,所有这些都是为了获得所需的帧速率。在iPhone上,我的目标速率是60。我不希望它降到30以下。当我爆炸时有几百个基于动画精灵的粒子,在iphone5上它降到30,而在4上降到更低。我必须决定降低某些设备的复杂性。有时,该决定会影响着色器。

但这通常不会影响多少个着色器,而是会根据我的帧频目标为任务使用哪种着色器。

在我看来,正确使用着色器会提高帧速率。我有一个具有80个着色器的应用程序,但是它并没有在一个帧上使用所有着色器-大概是10个。它会根据需要进行编译,并在场景之间丢弃它们。在我的硬件上,我还没有看到着色器计数效果帧速率。仅着色器中使用的技术。但是可以肯定的是,我认为使用2个相似的着色器比分支更复杂的着色器更好。

如果渲染速度较慢或在较慢的设备上,我也有着色器会降低质量。我在iPhone 5上使用了法线贴图,但是将着色器换成了在iPhone 4上不进行法线贴图的着色器。

我喜欢罗伊(Roy)的回答,而且我一直在试图深入了解“真实”游戏的制作方式。由于我是自学成才的,所以我永远不知道自己今天的伟大发现是如何完成的,还是仅比真正的专业人士落后几步。


1
您的答案“适用于iOS”这一事实没有问题。我之所以说PC是因为我想避免“取决于平台”的简短回答;)也许您的回答对我来说不是100%。但是,它仍然具有一些与平台无关的结论,因此我发现它很好。和社区的其他成员(使用iOS)可能会发现它甚至更有用,所以谢谢我的投票:)
PolGraphic 2014年

1

您实际上无法对应该拥有或不应该拥有多少个着色器的数量作出数字,因为它取决于游戏的限制因素以及目标平台。实际上,应遵循将活动着色器的数量减少为“仅实际需要的数量”的操作。有时这意味着您一次只有几个着色器(约10个),有时这意味着您只有几十个。

帮助限制游戏中弹出的排列数量的一种方法是实现“ ubershader”技术,通过该技术,几乎每个着色器都来自单个着色器,并且差异和特殊行为通过预处理器交换出来。当然,特殊效果也有例外,例如景深,环境光遮挡等等。

到目前为止,我对AAA游戏的经验表明,有几十个着色器处于活动状态并不是没有道理的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.