【狗刨学习网】 最近1个月做了unity 次世代开发的一些程序方面的支持工作,当然也是基于物理渲染相关的,主要还是skyshop 但在使用以及性能上,还是多少有些坑和不足,这里也是自己的一些心得吧,希望可以其他对这个方案有兴趣的朋友起到一些帮助。 一、遇到了fps降低的BUG 国庆节前的老版本工程和最新的工程版本运行起来没任何区别,但新版本在真机上的的运行效率有问题,只有7.5fps 开发和运行环境, XCode6.1 IOS8.1 IPad Air 分辨率 2048x1536 Graphic level GLES 3.0 图1 老版本的运行截图,为了能做参考,我这里把新版本的场景文件拷贝到老工程里 新版本相同的场景就只有不到8FPS 然后对两个版本用Xcode做了分析,旧版本fps analyze 新版本fps analyze,同样的shader消费的ms是老版的5倍 发现bug后,尝试定位问题 1 一开始认为是marmoset版本问题,但用老版本完全覆盖,fps并没有提升 2 删除和场景资源相关外的所有资源,重新build后,fps就恢复了,不过这种解决方法应该是无非接受的 目前临时的解决方法,把老工程的ProjectSettings里的文件替换过好了,具体的原因还要继续排查。
另外有一些版本的SkyShop的Mobile #pragma surface MarmosetSurf MarmosetDirect vertex:MarmosetVert exclude_path:prepass noforwardadd approxview #pragma only_renderers d3d9 opengl gles d3d11 d3d11_9x gles3 好早marmoset的是UberShader的设计,所以只要改几个就好了。 要unity支持es3.0的话,需要在设置Player Settings.. 的图形等级里选择 Automatic或强制gles3.0。 如果只用es2.0的话,因为unity会使用texCube或texCubeBias来替换texCubeLod,没有lod的支持,使用cubemap的mipmap来实现粗糙度的功能就会受到影响 最终渲染画面里可能会看不到材质的粗糙度表现。 如果把这个bug解决的话,那么性能评估应该和10.1前的报告一样,IPad 应该是在pixel shader上,如果1,2个IBL材质占满整个2048x1536屏幕的话,一样会有潜在的瓶颈问题产生。 二、关于另外一个场景的问题解决 Draw Call可以先在Editor或联机Porfile里查看,一些设备不支持Unity 没做任何优化的前提下 draw call是592, 首先是Terrain,不论是shader还是dc都有些多,在Xcode的Frame 水面可以优化反射部分的实现,静态场景的反射可以预烘培到一张贴图里,而可以反射的部分,建议单独添加到一个layer里。降低dc数量。摄像机的可视范围,角度,以及shader 三、关于Marmoset 1。如果不使用skyshop的天空盒的动态功能的话,skymanager的update可以关闭 public void LateUpdate() if(firstFrame) { if(_GlobalSky) { firstFrame = false; _GlobalSky.Apply(0); _GlobalSky.Apply(1); if(_SkyboxMaterial) { _GlobalSky.Apply(_SkyboxMaterial, 0); _GlobalSky.Apply(_SkyboxMaterial, 1); } } } #if UNITY_EDITOR if(!Application.isPlaying) return; #endif 直接在 #if UNITY_EDITOR前面返回return就可以了,这样可以节省skymanager的Update的cpu消耗和GC。 2 GlossyMap的使用,之前为了解决7FPS的问题时,尝试的一种解决方案,在Anylaze里直接修改textureLod的参数 tmpvar_40 = textureLod 例如 tmpvar_40 = textureLod 这样效率可以提高1倍以上 分析可以看下图 highp float glossLod_36; glossLod_36 = tmpvar_27; mediump vec4 spec_37; mediump vec4 lookup_38; highp vec4 tmpvar_39; tmpvar_39.xyz = ((v_33.xyz * tmpvar_32.x) + ((v_34.xyz * tmpvar_32.y) + (v_35.xyz * tmpvar_32.z))); tmpvar_39.w = glossLod_36; lookup_38 = tmpvar_39; lowp vec4 tmpvar_40; tmpvar_40 = textureLod (_SpecCubeIBL, lookup_38.xyz, lookup_38.w); 上面是还没有做任何修改的shader,lod,也就是lookup_38.w还是根据glossy tmpvar_39.w = glossLod_36; lookup_38 = tmpvar_39; lowp vec4 tmpvar_40; tmpvar_40 = textureLod (_SpecCubeIBL, lookup_38.xyz, 1.0); 在shader里直接传一个const值的方法,热更新后可以看到shader消费的ms和之前有一定的减少。 不过重新启动游戏的话,ms有了40%左右的减少,这是因为IOS做的优化,如果lod在shader运行前已经确定的话,会直接pre 所以,glossy map建议适量使用,一些不需要细节的材质可以直接用一个恒定的roughness参数替代。 还有就是关于pbr shader算法的优化,marmoset自己内部有MARMO_HQ的关键字,通过切换可以实现一定程度的优化,先是两种质量的对比 MARMO_LQ MARMO_HQ 差别在shader的精确度上,以及出射光的亮度上 MARMO_HQ的用处,对向量的规格化,起到类似能量守恒的作用,Fresenl函数的算法选择,使得渲染的出射光总量更符合物理效果 //self-shadowing blinn #ifdef MARMO_DIFFUSE_DIRECT spec *= saturate(10.0*dp); #else spec *= saturate(10.0*dot(N,L)); #endif #ifdef MARMO_DIFFUSE_DIRECT spec *= saturate(10.0*dp); #else spec *= saturate(10.0*dot(N,L)); #endif #ifdef MARMO_HQ localN = normalize(localN); #endif 以上是shader代码里一些规格化设置的样本。 shader里还有其他一些可优化点 例如Specular Intensity,Sharpenss,fresnel Strength,并不是pbr Material的标准参数,一般只需要roughness或glossy map里选择其一做粗糙度参数就可以 .而其他参数去掉可以减少一部分shader的计算量 前面提到的glossymap和roughness的切换,需要shader支持,编辑器也要做一定的修改。 fresenl 反射方程,marmoset提供了的 UberShader的设计是一个优点,在开发的时候可以减少很大的工作量,实际运行时,创建和编译shader数量也很少,方便分析和定位shader的问题,和在Xcode里进行优化调试。 另外就是marmoset的skymanager部分,还是需要修改的,他本来的设计目的是基于天空盒来生成IBL使用的Cubemap,而真正的IBL光照是基于周围环境来生成,所以,skyshop这种整个场景统一一张cubemap的方法,在真实性和效果上还是很值得斟酌的,它的IBL的生成和管理接口对做游戏来说也不是很方便,优点就是它提供了编辑器和cumbemap生成部分的全部代码,不论是扩展还是修改bug,都是可行的。 unity4.x的版本里,在移动端是无法支持延迟渲染方法的,所以对场景里的光源限制会比较严格,一盏方向光就是极限了,其他烘托场景的用的点光源,就只能使用lightmap了 最后考虑还是要和UE4的移动产品做一下竞品对比的: UE4的Sum Temple项目是个很好的参考,gles2.0的图形规格下,也能获得很好的效果 UE4 mobile的图形规格,简单来说就是一个Directional 接下来我会准备一篇针对UE4渲染和优化方法的分析。 四,总结 通过这次U3D的PBR的实验,在IPAD 声明:此篇文档时来自于【狗刨学习网】社区,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。 更多精彩内容:www.gopedu.com |
unity3d 基于物理渲染的问题解决
时间: 2024-10-15 07:54:20
unity3d 基于物理渲染的问题解决的相关文章
Unity3d 基于物理渲染Physically-Based Rendering之最终篇
前情提要: 讲求基本算法 Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF plus篇 Unity3d 基于物理渲染Physically-Based Rendering之实现 最后我们用fragment shader 实现,加上diffuse漫反射,代码和之前的surface差不多,只是多了reflect方向的计算,reflect方向的计算方法为用CG函数库中函数reflect, float3 reflect(float3 i, flo
Unity3d 基于物理渲染Physically-Based Rendering之实现
根据前文的例子http://blog.csdn.net/wolf96/article/details/44172243(不弄超链接了审核太慢)弄一下真正的基于物理的渲染逃了节课= =,弄了一下.公式和之前的文章一样,这次加上cubeMap贴图,由于方便,就直接用surface shader了,因为不用求reflect方向,之前也有这一篇文章说明surface shader中cubeMap的使用方法和实时反射的方法http://blog.csdn.net/wolf96/article/detail
Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF
在实时渲染中Physically-Based Rendering(PBR)中文为基于物理的渲染 它能为渲染的物体带来更真实的效果,而且能量守恒 稍微解释一下字母的意思,为对后文的理解有帮助, 从右到左 L为光线方向,H为半角向量,L是和V的中间,N为法线方向,V为我们眼睛的观察方向(相机看的方向),R为反射方向 Torrance-Sparrow光照模型的镜面反射公式 D为法线分布函数(NDF) F为反射函数(Fresnel 函数) G为阴影遮罩函数(几何函数),未被shadow或mask的比例
基于物理渲染的基础理论
本篇作为理论的概括介绍,并不涉及公式的部分 基于物理渲染的优点 很容易就可以作出真实和照片级的效果. 同一配置可以适用于在不同HDR光照环境下. 接口简单而直观,都是基于世界真实的参数.(如粗糙度,金属度,等等). 不需要美术去提供经验性的"奇怪"参数和配置. 更容易去解决问题和扩展需求. 基于物理的渲染和和传统区别 有着基于物理规则的光照模式 有着无处不在的fresnel效果 能量守恒“energy conservation”,物体平面的反射光无法超过它所解接受的入射光 基于物体材质
翻译 基于物理渲染的美术资源设计流程
基于物理的渲染 相关的系列文章又一篇,原创的总结也马上要发出来 如果要在游戏产品里推行基于物理的渲染,只有程序渲染管线是远远不够的,如何培训美术和设计人员去适应新的方法也是一个重要课题 这篇ppt也是我计划的一系列美术教材中的一篇,希望能对大家起到帮助,ppt里的有一个链接是要FQ的,为了方便,我就在这贴里翻译了 链接 http://pan.baidu.com/s/1mg2xSjY 49kw 原文 http://research.tri-ace.com/Data/cedec2012_FlowFo
翻译 次世代基于物理渲染的反射模型
本文是Tri-Ace在cedec2013上发表的次世代基于物理渲染的反射模型的翻译版,时间和能力有限,一些错误或者不好理解的地方也请联系我修正 受到physically-based shading at disney siggraph 2012的影响,很多引擎都对它有所借鉴,3A也是对他们以前的基于物理的Blinn-Phong的改进版模型做了解析后,参考Disney BRDF,设计了新的Model, 同时也在Cook-Torrance的Microfacet BRDF基础上,提出了自己对F ,G,
物理渲染-基于物理的光照模型
文章所用图片来自相关领域文献,如有侵权请联系撤除, 转载本文请注明出处 1.关于光照模型 对于图形学领域和图形学开发来说,实时渲染的光照模型是一个最最基础的问题,简单的来讲,光照模型就是用来描述在真实环境下,物体表面一点在在光照下的反射颜色值.有许许多多的光照模型试图用数学的公式来模拟这个问题,当然这即是一个物理问题,也是一个数学问题.大学时最初接触计算机图形学时,对书本上关于光照模型的推到过程就极为不解,最近为了研究基于物理的光照模型看到一篇10年siggrgrah的course,(<Phys
基于物理的渲染详尽指南 卷1光与介质:基于物理的渲染和着色理论
光与介质 基于物理的渲染和着色理论 此文对于程序员和美术制作人员都有很大的帮助作用,希望你看完后对基于物理的渲染有个整体的理解,此篇翻译的文章(The Comprehensive PBR Guide by Allegorithmic - vol. 1)基本上是从美术的角度来解释基于物理的渲染,有时间我会把程序部分的知识再细致讲一下,包括理论和实现,我自己目前也在学习阶段,主要在研究UE4的基于物理的渲染,希望在接下来的时间里出一个比较详细的文章来从程序员的角度详细阐述实现原理.
个人翻译的cedec2010基于物理的光照
作为自己介绍基于物理渲染计划的一部分,在自己总结和发布的同时,也会翻译一些国外的优秀资料做推广 本文是Tri Ace 在 cedec2010上发布的文章,主要描述了他们基于物理光照的实现方法,这种方法虽然没有被业界接受,但我感觉对了解PBR还是一份不错的科普读物 因此也做了翻译,因为时间原因,并没有做注解和太多的校正,如果有翻译的问题也请和我联系或交流,我会进一步做更新 http://pan.baidu.com/s/1c06bS7A 提取码 10rh