0x00 前言

因为前一段时间去英国出差,所以有日子没有更新专栏了。只好利用中秋假期来补交作业,顺便祝大家中秋节快乐。

在这篇文章中,我选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享。主要涵盖了UGUI、Lighting、Profiler、Shader Graph、SRP、Compute Shader、GLES等领域。

同时,也欢迎大家加入我们这个讨论干货的官方技术群,交流看法分享经验。

Unity官方社区交流群:629212643

0x01 UGUI

Q1:陈老师。我发现个问题。Unity 2018.2.3以后的几乎所有版本的inputfield没办法输入部分中文字符,比如“我”,我今天试了好多好多版本。2017是确定没有这个问题的。但是2018我从高到低装了好多。2018.1.9不存在这个问题。

A:Hi,这是一个已知的2018.2的Bug。Bug的原因是由于2018.2中将16bit的C# char截成了8bit的C++ char。我们会在2018.3中修复该问题,并且之后会Backport回2018.2的版本。

Q2:有一个UGUI做的prefab,每次apply之后第一个slider总是会错位,有遇到的吗?Unity版本2017.3.0f3。

A:嗯,这是一个已知Bug。并且该Bug已经在2017.3.1p1版本中修复了。推荐你直接升级使用我们的长期维护版本2017.4,该版本会持续修复发现的Bug。

0x02 Lighting

Q1: 最近场景要做烘焙阴影动态加载,尝试了下mixed灯光下烘焙出来的shadowmask贴图添加到lightmapping中没办法正常显示出来。看结构已经和取数值出来的时候是一模一样了。网上看到有人说,shadowmask需要保留光源在场景中,否则会显示失败。想了解是不是真的需要保留灯光。或者有其他做法可以动态加载shadowmask。

A: shadowmask是mixed光照模式的一种,并且它保存的是mask信息,而不是真实的光照产生的阴影效果。在mixed-shadowmask光照模式下,需要light来提供直接光,再利用阴影mask来生产阴影。

如果想要关闭光照,可以考虑使用mixed-subtractive模式或者bake模式。将直接光照结果预先烘焙到贴图上。

Q2:我有两个场景。第一个场景烘焙ok,第二个场景复制的第一个场景,然后加了点新的家具,再烘焙就都是黑的。而且场景内对象的light probes选项也不能勾选。LightMap没有丢失,就是烘焙出来都是黑的。

A:不能勾选light probe是因为你的物体设置了Lightmap static的flag,所以它的lighting信息会烘焙到Lightmap上,而不是从Light Probe中获取。

当然,如果是针对LOD Group的烘焙,在勾选了Lightmap static后,还是可以在模型上勾选light probe的,这是因为LOD需要light probe来提供间接光。

烘焙后模型变黑的问题,首先要确认是否为模型设置了UV2数据。这是因为烘焙时需要UV2数据。其次,可以检查一下模型的Shader中是否包含Meta Pass。

可以参考:Material properties and the GI system​docs.unity3d.com

同时,还需要检查一下场景中的Light是否开启,并正确的设定了属性。以及Lighting Window中的间接光Indirect Intensity不为0。

Q3:场景进行光照烘焙时存在速度较慢的问题,是否有一些设置上的改进或最佳实践?

A:在lighting设置窗口中,主要是由于Indirect Resolution的设置会影响烘焙的速度。

事实上,利用Lightmap Parameter机制可以对场景中不同的区域设置不同的烘焙参数,例如光照变化较为低频的部分可以创建一个分辨率较低的Lightmap Parameter,以节约烘焙时间。

参考文档:Fine tuning with Lightmap Parameters - Unity​unity3d.com

0x03 Profiler

Q:请问一下性能指标里面的SetPassCalls和Draw Calls、Batches这些有什区别,具体指什么呢?网上有人说是一样的东西,但是我发现有时候值不一样。

A:SetPass Call指的是切换渲染状态(render state)的次数,比如你的shader中如果有多个pass,或者是场景中有不同的material,都会造成渲染状态切换。

Drawcall的话,以gles为例,就是调用draw的实际次数,例如drawarray、drawelement,调用一次都会增加。

Batch则是会在第一次调用draw行为的时候加1,如果之后渲染状态没有改变,则batch的数量不再增加,但是一次batch内可能会有多次drawcall调用,只是渲染状态没有改变。

0x04 Shader Graph

Q:有朋友在用Shader Graph吗?请问它可以将节点转成shader供Unity 2017使用吗?

A:右键点击节点有一个copy code的选项,可以复制代码。针对根结点,则可以copy生成的全部代码。

但是不建议在Unity 2017中使用,因为Shader Graph主要是和SRP配合使用的,SRP Shader library和UnityCG.cginc中有比较多的区别。

0x05 SRP

Q:在Unity2018中,使用Lightweight Render Pipeline的时候,有一些Asset Store上的插件的显示结果不正确。

A: 传统渲染流水线的Built-in的Shader以及自定义的光照 Shader目前不能在新的Lightweight Render Pipeline中使用。LWRP有其自己的Shader。

如果是传统的Built-in Shader,则可以通过菜单选择直接升级到LWRP的Shader。

但是自己写的lit shader会比较麻烦,目前需要手动来修改。这是因为SRP Shader library和UnityCG.cginc中有比较多的区别。因此这个问题只能向插件作者反馈了,或者你仍然使用传统的渲染流水线。

0x06 Compute Shader

Q:话说Unity的Compute Shader传float数组一直有bug。比如传float[5],C#里写ComputeShader.SetFloats是无法成功的,只有第一个float可以设置成功,这个bug官方已知吗?

A: 这个不是bug。而是根据HLSL的规则,应该对数据进行对齐,以避免为计算偏移所导致的ALU开销。

HLSL的相关文档可以参考:Packing Rules for Constant Variables​docs.microsoft.com

“Arrays are not packed in HLSL by default. To avoid forcing the shader to take on ALU overhead for offset computations, every element in an array is stored in a four-component vector.”

因此调用带有float []参数的SetFloats应根据HLSL规则进行对齐,即float []应按每个数据16字节,也就是float4的形式传递。

例如如下格式:

//Setup Float Array

_floatArray = new float[4*4];

_floatArray[0] = 0.25f;

_floatArray[4] = 0.50f;

_floatArray[8] = 0.75f;

_floatArray[12] = 1.00f;

传递的结果就是,(0.25, 0.5, 0.75,1)。

而Unity的文档中,其实也有提到这个问题。具体内容可以查看文档。ComputeShader.SetFloats​docs.unity3d.com

This function can be used to set float vector, float array or float vector array values. For example, float4 myArray[4] in the compute shader can be filled by passing 16 floats.

0x07 GLES

Q:我们现在需要一个非压缩单通道格式的纹理,作为palatte使用。用Alpha8在某些mali gpu手机上有问题,会变成rgba32位格式,内存增加4倍。请问是为什么?另外R8的这个在哪里可以设置?

A:第一个问题,在某些mali gpu手机上有问题,这是由于Alpha8 texture format在OpenGL ES 3 及以上版本中被移除了,因此我们使用了GL_EXT_texture_swizzle拓展来实现类似的功能,但是GL_EXT_texture_swizzle拓展在某些mali gpu的手机上的实现存在问题,导致该功能不能正常工作。

如果要使用R8格式,可以将Texture Type设置为Single Channel,选择Red即可。

0x08 后记

好了,以上就是想和大家分享的几个在群里讨论的小问题。

再次,欢迎大家加入我们这个讨论干货的官方技术群,交流分享呀。

Unity官方社区交流群:629212643

-EOF-

最后打个广告,欢迎支持我的书《Unity 3D脚本编程:使用C#语言开发跨平台游戏》(陈嘉栋)【摘要 书评 试读】- 京东图书​item.jd.com

shader 如何声明数组_聊聊如何正确向Compute Shader传递数组相关推荐

  1. 多个数字数组_三菱ST语言教学(2)——数组的使用

    上一篇文章介绍了ST基本指令的用法,和声明基本数据类型的标签,但标签除了可以声明单个的基本数据,还可以声明多个数据构成的数组(array),也可以声明结构体(struct)和功能块(function ...

  2. python生成一个数组_在for循环中创建多个数组(Python)

    我目前遇到Numpy阵列的问题.如果在其他地方已经提出这个问题,我道歉,但我觉得我到处都是. 我最初的问题是我试图创建一个数组并用多组不同大小的站数据填充它.由于我无法使用大小不同的数据集填充相同的数 ...

  3. object转换为数组_从V8源码分析一个JS 数组的内存占用问题

    前段时间,在排查一个问题的时候,遇到了一个有点令人困惑的情况,有下面这两段代码: const a = new Array(99999);a[99998] = undefined; const b = ...

  4. ajax里数组添加数据,小笔记(一):ajax传递数组及将ajax返回数据赋值

    当使用ajax传递数据时,有可能传递多个数据,这是使用以下方法传递数据就会显得数据过多且混杂 $.ajax({ type:'post', url:url, data:{data:data,conten ...

  5. python创建字符串数组_如何创建任意长度字符串的numpy数组?

    您可以通过创建一个dtype=object数组来执行此操作.如果尝试将长字符串分配给普通numpy数组,它将截断该字符串:>>> a = numpy.array(['apples', ...

  6. @value 数组_为什么不推荐用for...in遍历数组

    (一)for...in引发的一个报错 两年前写的一个文章目录生成插件vue-outline,一直用着没出啥问题(本站的文章目录也是用该插件生成的).但是最近一个网友在使用的时候却出现了异常报错,异常代 ...

  7. sql server 数组_如何在SQL Server中实现类似数组的功能

    sql server 数组 介绍 (Introduction) I was training some Oracle DBAs in T-SQL and they asked me how to cr ...

  8. java javascript数组_浅谈javascript和java中的数组

    javascript中的数组 数组的创建 直接创建方式  var str = ['java', 'js']; 使用new创建方式: var a = new Array(10);  //  定义长度为1 ...

  9. java初始化字符串数组_在java中如何定义一个字符串数组

    展开全部 1. java中定义一个字符串数组方式如32313133353236313431303231363533e59b9ee7ad9431333366306465下,string类型和其他基本类型 ...

  10. c#解析json字符串数组_使用json.NET和C#解析JSON数组

    我有一些我需要解析的以下 JSON格式的数据: { "status":0, "timestamp":"8:20pm", "rout ...

最新文章

  1. 报名 | 工业大数据分析:机会与挑战讲座
  2. [GDUT 决赛]--GCD,LCM——我是好人(数论)
  3. 使用WindowManager添加View——悬浮窗口的基本原理
  4. java学习(127):finally语句
  5. pandas 合并所有列_图解Python表格操作包Pandas
  6. cleanmymac X 4.7.3更新(支持M1芯片)
  7. windows获取IP和MAC地址【Qt】
  8. WordPress Shortcode(简码)介绍及使用详解
  9. 通过两个小栗子来说说Java的sleep、wait、notify、notifyAll的用法
  10. java redirect 超时_java – Spring Security 3.0重定向到超时的页面
  11. 洪恩在线nbsp;Css快速入门。
  12. As a good Java programer
  13. oracle lookup函数,LOOKUP函数用法全解(上)——LOOKUP函数的5种用法
  14. 局域网内查询嵌入式设备IP的几种方式
  15. 重磅!IEEE Fellow周礼栋担任微软全球资深副总裁
  16. 屏幕录制方法?如何在电脑进行屏幕录制
  17. 基于ORB-SLAM2实时构建稠密点云
  18. 2016计算机cpu,看完你再评论!2016年CPU市场展望分析
  19. vant indexbar 做城市列表
  20. php转行室内设计,干货贴!15个玩转室内设计的app

热门文章

  1. linux 登录直接进入系统,Linux登录和推出系统入门教程
  2. 3个免费开源的项目管理/甘特图软件
  3. 免费JS甘特图组件dhtmlxgantt
  4. SuperMap许可驱动安装流程详解
  5. 没有IDEA与Eclipse,该怎么学Java?
  6. 《算法竞赛入门经典》例题5.4.1
  7. dodaf体系结构建模与分析系统软件
  8. html播放优酷链接视频教程,视频教程链接(请将网址复制粘贴到浏览器地址栏查看):...
  9. 聊聊几款文件同步备份工具,你更喜欢哪一款呢?
  10. JavaWeb篇-谷歌验证码的使用