Notifications
Article
不能直接获取?聊聊如何在Shader Graph中获取深度图
Updated 4 months ago
534
0
在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享。主要涵盖了 StreamingAssets、Profiler、Playable、Particle、Spine、Launcher、Scripting 、Shader、 Shader Graph等领域,其中会着重介绍用一个workaround的方式在ShaderGraph中获取_CameraDepthTexture,也就是深度图。

0x00 前言

在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享。主要涵盖了 StreamingAssets、Profiler、Playable、Particle、Spine、Launcher、Scripting 、Shader、 Shader Graph等领域,其中会着重介绍用一个workaround的方式在ShaderGraph中获取_CameraDepthTexture,也就是深度图。
同时,也欢迎大家加入我们这个讨论干货的官方技术群,交流看法分享经验。
Unity官方社区交流群:629212643

0x01 StreamingAssets

Q:请问一下,在Unity2018.2版本里,Unity会将放在StreamingAssets文件夹下的js文件当作Unity的UnityScript进行编译,但是我的资源里面有html页面,需要用到这个js文件。
A:我们分别在2018.2和2018.1上进行了测试。在Unity2018.2中,的确会将StreamingAssets文件夹下的js文件当作UnityScript进行编译,这应该是2018.2之后出现的一个Bug。
这个Bug已经提交,相关链接可以查看这里:
https://issuetracker.unity3d.com/issues/non-unity-javascript-files-inside-the-streamingassets-folder-are-being-compiled-as-unityscript-files。

0x02 Profiler

Q:请问使用Profiler.BeginSample去标识代码块或者方法以便在Profiler性能分析工具中查看对应代码块的资源消耗,在unity2017.4.5版本将标识写在脚本的start无法成功标识,然而一样的代码在unity5.4版本却可以标识出来,但在标识写在unity2017.4.5的Update方法貌似也可以标识代码块。这个问题是版本问题吗?在2017.4.5的版本在某些初始化时应该怎样成功标识呢?
A:嗯。查了一下2017.3之后的版本修改了profiler数据的发送方式,从以前的frame base变成了stream base,在第一帧engine向editor发送的profiler数据丢掉了很多sampler,所以导致没有显示出来。
但是beginsample并不是不会在start方法中生效,游戏启动之后开启脚本的话还是可以看到的。启动时sampler不全的问题应该在2018上进行了修改。
所以,简单的说,没有显示BeginSample去标识的start代码块的原因是在2017.3-2017.4时有的sampler被丢弃了。并不是针对某个特定的方法不显示。

0x03 Playable

Q:在使用Playable的api时遇到了一些问题,下面第一张图是正常的情况。第二张图是调用:
mixerPlayable.SetInputWeight(0, 1.5f);
将input0的权重设置为1.5之后的情况。整个模型被不正确的拉伸,并且动作表现错误。
A: playerable mixer的混合是这样的机制:Weight1 * animation1 + Weight2 * animation2 + Weight3 * animation3....。因此在权重总和大于1的时候会出现问题。建议对传入的权重进行归一化。

0x04 Particle

Q: 我有这样一个结构,刚刚创建是正常的。
现在把它Disable掉后调转180度。
再激活,黄色部分的发射器是正常的,红色是子粒子,发射错误。

A: 经过测试,这是一个Bug,即在play mode的情况下,disable掉parent对象并修改其transform数据后,subemitter并没有正确继承其parent的transform数据。
该问题已经向开发人员提交了Bug,可以在此查看:
https://issuetracker.unity3d.com/issues/particle-subemitters-dont-inherit-parents-rotation-correctly-while-the-parent-object-is-disabled-in-play-mode

0x05 Spine

Q1:请问大家,当spine导出图片是两张时,unity编辑器里播放的动画就是乱的。有什么解决办法吗?

A: 导出设置里的“缩放”选项的scale缩小一下,比如改成0.8,导成一张。(成都-树林)

Q2:还是不够放到一张,可以再缩小吗?
A:去掉空白处,图集小很多。(成都-树林)


0x06 Launcher

Q1:我遇到了启动界面白屏的问题,5.6.0和2018最新版本都有,而且网上讲的办法都试过了,都不行,试了一整天了。

A1:白屏的问题解决了,怀疑是双显卡导致的,Unity的快捷方式右键可以选择运行的显卡,我来回切了两次就可以了。(深圳~刘彦)
A2:这种并非卡在loading页面的白屏,有可能是DX的驱动不兼容造成的,可以尝试切换运行的显卡,也可以尝试一下在命令行强制使用GL启动。
相关命令行参数可以参考这个文档:
https://docs.unity3d.com/Manual/CommandLineArguments.html

Q2:无限卡Loading…有人遇到过么?

A:卡Loading的问题,很多时候可以看看editor.log里面的相关输出。
例如下面这样的log:
No sufficient permissions while processing request “https://core.cloud.unity3d.com/api/login“, HTTP error code 401
一般卡loading基本都是网络原因的多。可以试试断网,进入离线模式。有vpn的话也可以先去掉vpn这些,有的时候是因为vpn的各种奇葩的配置导致的,当然还可以查看一下防火墙的设置。
还有另外一种情况,例如下面这样的log:
COMMAND LINE ARGUMENTS:
D:\u2017.1\Editor\Unity.exe [CEF] undefined in file:///C%3A%2FUsers%2Falex%2FAppData%2FRoaming%2FUnity%2FPackages%2Fnode_modules%2Funity-editor-home%2Fdist/assets/unity-editor-home.js at line 39 Error loading https://api.unity.com/v1/oauth2/authorize?client_id=launcher&display=launcher&locale=en_US&response_type=code&redirect_uri=launcher://unity/C%3A%2FUsers%2Falex%2FAppData%2FRoaming%2FUnity%2FPackages%2Fnode_modules%2Funity-editor-home%2Fdist/index.html#/login
此时可以考虑移除”C:\Users\XXXXXX\AppData\LocalLow\Unity”文件夹,因为该文件夹会缓存一些登陆信息,移除之后再尝试启动Editor。

0x07 Scripting

Q1:刚学u3d不久,想问几个问题:
1.公司里是怎么生成json文件的
2.数据库的增删改,是直接在数据库文件里修改,还是写代码修改,如果公司有自己的服务器,
怎么拿到服务器里的数据.
求经验大佬来指教.

A:绝大多数编程语言都有生成json的方法,直接调用即可,比如java可以使用gson包。
数据库操作可以使用第三方框架,java的后台可以考虑hibernate或者mybatis。安卓端本地的sqlite可以使用content provider来调用数据库。Unity也有自己的使用sqlite的方法,不过我没用过。(南京-科穆宁)

Q2:话说开发手机ARCore要测试好不方便,每次都要打包出来…..请问大家有碰到过这个问题吗?有好的测试方法吗?谢谢~
A:Unity有提供一个叫做EditorConnection的类,可以用来满足类似的需求。相关文档可以查阅:
https://docs.unity3d.com/ScriptReference/Networking.PlayerConnection.EditorConnection.html

0x08 Shader Shader Graph

Q1:怎样让着色器弄成这样,我翻了文档,没查到。。。
A:这个是因为Shader文件中没有标示出ShaderSnippets,比如你创建一个surface shader,然后把CGPROGRAM去掉,也会是这个效果。


Q2:请问如何在ShaderGraph中获取深度图,例如_CameraDepthTexture?Unity版本2018.2。

A: 默认情况下,ShaderGraph没有提供接口直接获取_CameraDepthTexture的。
但是有一个workaround的方式可以来获取_CameraDepthTexture。即创建一个新的property,该property的name和reference都叫_CameraDepthTexture,与此同时不勾选exposed。

同时,打开LightWeightRenderPipeline Asset中的深度图选项。
场景中的Camera要添加一个LightweightAdditionalCameraData组件,并且也打开深度图的选项。
之后,我们就可以正常的获取深度图_CameraDepthTexture了。


0x09 后记

好了,以上就是想和大家分享的几个在群里讨论的小问题。
再次,欢迎大家加入我们这个讨论干货的官方技术群,交流分享呀。
Unity官方社区交流群:629212643

相关链接:

Unity User Group 北京站2018年7月活动:
https://connect.unity.com/p/unity-user-group-bei-jing-zhan-2018nian-7yue-huo-dong

Jiadong Chen 陈嘉栋
Unity China Field Engineer - Programmer
28
Comments