位置: 编程技术 - 正文

unity3d 基于物理渲染的问题解决(unity3d 物理引擎)

编辑:rootadmin
【狗刨学习网】最近1个月做了unity 次世代开发的一些程序方面的支持工作,当然也是基于物理渲染相关的,主要还是skyshop marmoset的使用吧,他算是unity4.x版本 PBR的优秀方案之一了但在使用以及性能上,还是多少有些坑和不足,这里也是自己的一些心得吧,希望可以其他对这个方案有兴趣的朋友起到一些帮助。一、遇到了fps降低的BUG国庆节前的老版本工程和最新的工程版本运行起来没任何区别,但新版本在真机上的的运行效率有问题,只有7.5fps开发和运行环境,XCode6.1 IOS8.1 IPad Air 分辨率 xGraphic level GLES 3.0 图1 老版本的运行截图,为了能做参考,我这里把新版本的场景文件拷贝到老工程里 新版本相同的场景就只有不到8FPS然后对两个版本用Xcode做了分析,旧版本fps analyze新版本fps analyze,同样的shader消费的ms是老版的5倍 发现bug后,尝试定位问题 1 一开始认为是marmoset版本问题,但用老版本完全覆盖,fps并没有提升 2 删除和场景资源相关外的所有资源,重新build后,fps就恢复了,不过这种解决方法应该是无非接受的目前临时的解决方法,把老工程的ProjectSettings里的文件替换过好了,具体的原因还要继续排查。 另外有一些版本的SkyShop的Mobile shader没有gles3.0的支持,需要在给所有场景里使用的Marmoset的shader里添加关键字#pragma surface MarmosetSurf MarmosetDirect vertex:MarmosetVert exclude_path:prepass noforwardadd approxview#pragma only_renderers d3d9 opengl gles d3d d3d_9x gles3好早marmoset的是UberShader的设计,所以只要改几个就好了。要unity支持es3.0的话,需要在设置Player Settings.. 的图形等级里选择 Automatic或强制gles3.0。 如果只用es2.0的话,因为unity会使用texCube或texCubeBias来替换texCubeLod,没有lod的支持,使用cubemap的mipmap来实现粗糙度的功能就会受到影响最终渲染画面里可能会看不到材质的粗糙度表现。如果把这个bug解决的话,那么性能评估应该和.1前的报告一样,IPad Air 可以承受的是全屏,Draw Call的支持IBL材质物体的绘制,另外有IBL的shader的瓶颈应该是在pixel shader上,如果1,2个IBL材质占满整个x屏幕的话,一样会有潜在的瓶颈问题产生。二、关于另外一个场景的问题解决Draw Call可以先在Editor或联机Porfile里查看,一些设备不支持Unity Editor的GPU Profile,所以还是要用到Xcode 没做任何优化的前提下 draw call是, GPU里两个占用最高的shader,9.8ms和7.ms都是Terrain占用的(地形和他和阴影贴图),另外关闭阴影后为 drawcall,关闭地形后->(地形 dc),关闭水面dc->dc(水面反射)首先是Terrain,不论是shader还是dc都有些多,在Xcode的Frame view里,Terrain的绘制有不合理的地方,从截图场景来看,这种大小的地形需要的draw call次数有些夸张了,另外就是shader上,如果是静态烘培阴影,应该是可以合并到一个shader里绘制的。建议还是从优化地形开始,降低dc,合并shader,如果u3d 的terrain没有优化的可能,不如就直接max里制作网&#;的地面来代替。水面可以优化反射部分的实现,静态场景的反射可以预烘培到一张贴图里,而可以反射的部分,建议单独添加到一个layer里。降低dc数量。摄像机的可视范围,角度,以及shader Lod的设置,在Xcode的分析中,一些极远位置的山体还是被绘制了,而且和近处的角色一样高质量的shader,这点用unity的内部设置应该就可以解决。另外这个demo摄像机的角度过低,导致远处的物体也都被渲染到,如果适当修改摄像机角度,例如传统的视角,应该可以裁剪一部分场景物体。起到降低dc和ps填充率的作用。三、关于Marmoset shader的改进意见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_ = textureLod (_SpecCubeIBL, lookup_.xyz, lookup_.w);例如tmpvar_ = textureLod (_SpecCubeIBL, lookup_.xyz, 1);,这样效率可以提高1倍以上分析可以看下图 highp float glossLod_; glossLod_ = tmpvar_; mediump vec4 spec_; mediump vec4 lookup_; highp vec4 tmpvar_; tmpvar_.xyz = ((v_.xyz * tmpvar_.x) &#; ((v_.xyz * tmpvar_.y) &#; (v_.xyz * tmpvar_.z))); tmpvar_.w = glossLod_; lookup_ = tmpvar_; lowp vec4 tmpvar_; tmpvar_ = textureLod (_SpecCubeIBL, lookup_.xyz, lookup_.w);上面是还没有做任何修改的shader,lod,也就是lookup_.w还是根据glossy map的&#;,在shader里计算得出 tmpvar_.w = glossLod_; lookup_ = tmpvar_; lowp vec4 tmpvar_; tmpvar_ = textureLod (_SpecCubeIBL, lookup_.xyz, 1.0);在shader里直接传一个const&#;的方法,热更新后可以看到shader消费的ms和之前有一定的减少。不过重新启动游戏的话,ms有了%左右的减少,这是因为IOS做的优化,如果lod在shader运行前已经确定的话,会直接pre fetch制定的texture,就不需要在每个pix shader里重新执行一次采样了。 所以,glossy map建议适量使用,一些不需要细节的材质可以直接用一个恒定的roughness参数替代。还有就是关于pbr shader算法的优化,marmoset自己内部有MARMO_HQ的关键字,通过切换可以实现一定程度的优化,先是两种质量的对比MARMO_LQMARMO_HQ 差别在shader的精确度上,以及出射光的亮度上 MARMO_HQ的用处,对向量的规&#;化,起到类&#;能量守恒的作用,Fresenl函数的算法选择,使得渲染的出射光总量更符合物理效果//self-shadowing blinn#ifdef MARMO_DIFFUSE_DIRECT spec *= saturate(.0*dp);#else spec *= saturate(.0*dot(N,L));#endif#ifdef MARMO_DIFFUSE_DIRECT spec *= saturate(.0*dp);#else spec *= saturate(.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提供了的 splineFresnel和fastFresnel的两种方法,但实际的计算量还是比较多,根据GDC上的unity5的方案,可以换成简单的pow 4次方的形式。 确定TextureCubeLod的方向和lod&#;的算法上也优化的空间。 UberShader的设计是一个优点,在开发的时候可以减少很大的工作量,实际运行时,创建和编译shader数量也很少,方便分析和定位shader的问题,和在Xcode里进行优化调试。 另外就是marmoset的skymanager部分,还是需要修改的,他本来的设计目的是基于天空盒来生成IBL使用的Cubemap,而真正的IBL光照是基于周围环境来生成,所以,skyshop这种整个场景统一一张cubemap的方法,在真实性和效果上还是很&#;得斟酌的,它的IBL的生成和管理接口对做游戏来说也不是很方便,优点就是它提供了编辑器和cumbemap生成部分的全部代码,不论是扩展还是修改bug,都是可行的。 unity4.x的版本里,在移动端是无法支持延迟渲染方法的,所以对场景里的光源限制会比较严&#;,一盏方向光就是极限了,其他烘托场景的用的点光源,就只能使用lightmap了 而lightmap的具体算法,也是要用户自己实现的,Marmoset在MarmosetDirect.cginc里实现了directional lightmap lighting的实现,LightingMarmosetDirect_DirLightmap 这个的命名是要按照unity custom shader的规范来命名,就可以在unity渲染管线里自动被识别,如果想优化,或者要支持Dual lightmap等其他类型的liaghtmap,最好还是自己提供优化的方法。希望我们自己的项目里,将来能提供TBDR的支持来达到大量光源的支持。最后考虑还是要和UE4的移动产品做一下竞品对比的:UE4的Sum Temple项目是个很好的参考,gles2.0的图形规&#;下,也能获得很好的效果UE4 mobile的图形规&#;,简单来说就是一个Directional light&#;distance shadow来生成光照和阴影,其他的场景明暗和各种颜色灯光的亮度由lightmap来实现,IBL方面,可以为通过设置RefelctCapture,给制定区域内的对象生成IBL,同一场景内可以使用多个cubemap的实现(ppt里说他在移动端是使用了一个统一的cubemap,这点需要后面直接对它的工程做真机剖析了)。另外也有bloom&#;AA&#;light shaft&#;dof等的后处理效果,但因为图形规&#;的限制,ES2.0版本是没有真实HDR的支持的。接下来我会准备一篇针对UE4渲染和优化方法的分析。四,总结 通过这次U3D的PBR的实验,在IPAD Air和K1这种硬件级别的机器上,制作PBR的游戏还是没有问题的,一开始担心视网膜屏的填充率问题,在实际测试中,还是可行的,但需要整个开发团队有一定的优化意识,才能在整个上保证一个良好的运行效率,比如支持IBL的分配,而且游戏制作方面,也要考虑什么样的游戏类型,才能发挥PBR渲染的优势,特别是间接照明对游戏场景品质的提升(消费最高的IBLshader支持的是间接照明的高光部分)。还有就是多使用unity的batch功能,尽量降低dc和关于shader状态切换等等,另外可惜的是,因为之前7fps bug的问题,这次没有时间把unity的post effect部分实现,个人考虑是可以把ue4的这部分实现移植过来, UE4对U3D可以起到很好的竞品作用,在今后的PBR效果和效率的测试和优化中,一定的对比分析和借鉴,也是很有帮助的。声明:此篇文档时来自于【狗刨学习网】社区,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。更多精彩内容:www.gopedu.com

推荐整理分享unity3d 基于物理渲染的问题解决(unity3d 物理引擎),希望有所帮助,仅作参考,欢迎阅读内容。

unity3d 基于物理渲染的问题解决(unity3d 物理引擎)

文章相关热门搜索词:unity2d物理,unity物理特性,unity物理系统,unity2d物理,unity physics,unity3d物理引擎介绍,unity物理系统,unity3d基于物理系统的2D平台跳跃游戏,内容如对您有帮助,希望把文章链接给更多的朋友!

Unity编译dll 一、为什么要编译DLL编译后的DLL文件可以被添加到工程中,并且DLL中所包含的类可以像普通的脚本一样被访问。一般而言,在Unity中编写脚本比DLLS要简

unity3d 图集图片出现切边的解决方案 ios8的屏幕横屏解决方案 以及屏幕适配 图集出现切边有可能是因为图集中图片发生了挤压ios8横屏解决方案直接更新至4.6.1就ok屏幕适配解决方案:/*经测试size和缩放比例无关,缩放比例改变siz

unity3d 如何获得unity3d物体尺寸 原文地址:

标签: unity3d 物理引擎

本文链接地址:https://www.jiuchutong.com/biancheng/380250.html 转载请保留说明!

上一篇:手游开发商Plarium谈游戏研发的2大‘秘方’(手游开发商和发行商有哪些)

下一篇:Unity编译dll(unity编译速度吃什么硬件?)

  • 医疗批发企业增值税税负率大概是多少
  • 没有购销合同可以开票吗
  • 收到退回的款项怎么做分录
  • 个人劳务票必须本人开吗
  • 教育培训行业是干什么的
  • 什么是进项加计扣除
  • 上个月发票忘记开了怎么办
  • 发票的红冲和作废有何区别
  • 管理费用怎么结转成本
  • 抵扣认证的发票开红字有影响吗
  • 销售原材料需要交消费税吗
  • 纳税人在什么情况下可以延期申报
  • 如何进行无形资产核算
  • 车辆报废收入如何处理
  • 材料已入库后收货怎么写
  • 房地产开发预提费用
  • 虚开发票什么意思?
  • 电子钥匙续费能退款吗
  • 消费金融服务要交税吗
  • 个体户进项发票多开出发票少怎么办
  • 土地使用权的原值和账面价值
  • 汇算清缴之前找回来成本发票可以吗
  • 增值税小规模纳税人减免增值税政策
  • 租税联动政策
  • 善意取得虚开增值税专用发票追征期
  • win8系统怎么关闭防火墙
  • 工会经费,职工福利费,教育经费的扣除标准
  • 工程服务的采购合同范本
  • 开办费计入长期待摊费用汇算清缴时怎么填写
  • 个人去税务局开租房发票需要缴纳多少税点
  • 成本核算怎么做账
  • 酒水专用发票税率
  • pniopcacexe是什么进程
  • 如何在局域网内发布网页
  • 角马群的迁徙方向
  • 亏损企业所得税汇算清缴怎么做
  • php 文件传输
  • 增值税税控系统专用设备费及技术维护费抵扣
  • pytorch1.5
  • span标签中的字符串怎么获取
  • PHP中spl_autoload_register()函数用法实例详解
  • 一个残疾证一年单位免多少税2023
  • 折扣方式销售有哪些类型
  • 旅行社代订机票可以报销吗
  • 资产盘盈盘亏处理
  • 股东分红算不算股利
  • 个人账户收到多少钱会被监控
  • 小规模纳税人要报个人所得税吗
  • 固定资产清理是三栏式还是多栏式
  • 银行汇票用什么会计分录
  • 数据库用户名称
  • 固定资产进项留存怎么算
  • 软件开发销售属于什么行业
  • 房地产企业预缴土地增值税
  • 销售返利如何做账
  • 材料采购是什么会计要素
  • 普通发票的开具是怎样?
  • 出口转内销进项税额怎么进附表二
  • 原始凭证的审核和填制
  • centos访问网页命令
  • win8系统忘记电脑开机密码怎么办
  • 电脑显示windowsxp不能进入桌面
  • win7系统电脑怎么连接热点
  • linuxzen
  • 圣诞老人现在在干嘛
  • Win10 Mobile 10586.71截图曝光 修复已知问题
  • win8设备管理器没有端口
  • android skia opengl
  • js 仿真
  • javascript运行在什么的脚本语言
  • python根据ip获取主机名
  • jqgrid单元格点击事件
  • 查询同一网段下的其他ip
  • 查看本机开放端口号
  • vuex的理解
  • JavaScript中setMonth()方法的使用详解
  • 置顶是怎么弄的
  • ActivityManagerService (二)
  • 税控盘税务数字证书密码忘记怎么办
  • 人防异地建设费标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设