您的位置:首页 > Web前端

Über-shader与deferred shading

2015-09-12 10:33 323 查看
shade代码体积越来越小促使了HLSL做出了这种改变,或者说是升级。对于任何一款游戏,编程人员和美工要做的就是要么构建一种单一的大型shader,要么编写大量的小型shader程序。这些代码资源是非常巨大的,而且如果没有OOP (Object Oriented Programming,面向对象程序设计的) 指令的话是很难管理的。但是这与某种代码是如何与其他OOP协同工作是存在区别的。比如说,对于内存管理(因为哪里没有pointer)或者HLSL的构造函数而言,就并不需要OOP。类似初始化之类的任务是通过不间断的缓冲升级实现的,这种缓存通常可以反射数据成员。



---------简单来说就是HLSL语法的增强,提供一定程度的面向对象支持(当然也需要显卡硬件的提供类似间址寻址的功能),让你可以在HLSL里使用 interface和class。这样你可以把 光照、材质、雾等计算都定义成接口,然后提供不同的类实现,也就是把当前uber shader(uber是德语的 超级)里的大量的if-else都变成了简单明了的面向对象程序。

也就是说,这个只是shader程序语法上的增强,功能上,你用if-else也一样能实现。当然,如果硬件对此有优化的话,也可能有更好的运行效率。

{:4_230:}说到是很多小shader好还是单个uber shader好的问题的话,没有唯一正确的答案。如果shader非常多(例如大于20)肯定是不好的,因为切换次数太多会降低效率。集中到一个uber shader是另一极端,取决于你的引擎,可能可行,也可能会遇到问题。比如shader长度在sm3及以前是有长度限制的,而且if-else也是要花费执行时间的。所以,根据情况,完全可以有若干的sub-uber shader,即为中庸,因利制宜。

---------search "the supershader" in google

---------以前一直觉得Über-shader是有一点极端的方法,何必要牺牲一定的灵活性将所有shading逻辑都整合在一起呢?如果说为了减少shader切换的次数以提高性能,切换两三次与一次也不切换性能也差不了太多,有点不太划算。

最近把渲染方式往deferred shading上靠,终于体会到,用了deferred shading,很自然的就有用Über-shader的倾向。因为deferred shading把光照等主要计算全都延后到image space做了,所以

1、前面只是把各个模型的纹理颜色、法向、深度、高光强度等信息写到render targets里,自然没什么大差别,并不很需要分不同的shader。

2、后面利用前面渲染出的保存了各种信息的纹理,在image space计算光照等,这时已经不能区分到底是哪个模型的像素了,必然倾向于用统一的处理方法。准确的说,也不是完全不能区分,也可以在第一步里把material id也写到RT里,然后在第二步做if-else。但这些分支仍然在同一个shader里,所以还是Über-shader。

3、image space的光照,和后面的post process,都是在image space,完全不用分多个shader,最多只是一个shader的多个pass。

但是,半透明物体的shader似乎无法整合进去,还是需要用传统方法在deferred shading之后做。

---------真正实用化的deferred pipeline里面都不用uber shader,而是同一用同一种BRDF,比如Phong。(博主注:像现在unity5一样的 standard shader 统一PBR,通过调节roughness,附上不同材质detail map 来做到自然界中几乎所有材质)

---------是有用同一种BRDF的强烈倾向,但从美工效果上也仍然有使用不同BRDF的动机,象S.T.A.L.K.E.R.就用了material ID。我觉得我也可能要如此,地表的光照效果需要一点非物理正确的效果增强。

-------deferred
shading是将材质计算和光照计算解耦,如果不用deferred shading那么shader数量 = N种材质Shader * M种光照Shader,有了deferred shading,那么乘法就变成了加法。这个跟Über-shader没有必然关系,即使不用deferred shading,你也可以写一个超级Shader把N*M种Shader写在一个Shader里。


----------多种光照模型都可以用BRDF表达,也就是不同的BRDF。Über-shader就是所有的东西都写到一个shader里,用条件分支对不同材质光照做不同的处理。

BRDF又可以优化成预计算的纹理查询,传统的CAD常用这种方法优化。

---------Most particles can be sorted, have to use uber shaders (from:The Rendering Pipeline - Challenges & Next Steps)

博主注:仔细一想感觉和multi_compile的理念差不多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: