0x00 前言

前一段时间去英国出差,发现Unity Brighton 办公室的手绘地图墙很漂亮,在这里分享给大家。

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

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

Unity官方社区交流群:629212643

0x01 UGUI

Q:陈老师。我发现个问题。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的版本。

Q:有一个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信息,即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。

可以参考:

https://docs.unity3d.com/Manual/MetaPass.html

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

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

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

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

(参考文档:https://unity3d.com/cn/learn/tutorials/topics/graphics/fine-tuning-lightmap-parameters?playlist=17102)

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的相关文档可以参考:

https://docs.microsoft.com/zh-cn/windows/desktop/direct3dhlsl/dx-graphics-hlsl-packing-rules

"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的文档中,其实也有提到这个问题。具体内容可以查看文档。

https://docs.unity3d.com/ScriptReference/ComputeShader.SetFloats.html

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

聊聊如何正确向Compute Shader传递数组的更多相关文章

  1. 【原创翻译】初识Unity中的Compute Shader

    一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...

  3. C++ 数组作为函数参数时,传递数组大小的方法

    废话不多说,先上错误示范: void fun(int arr[arr_num]) { // ... } int main() { // ... int *arr = new int[10]; fun( ...

  4. springMVC通过ajax传递参数list对象或传递数组对象到后台

    springMVC通过ajax传递参数list对象或传递数组对象到后台 环境: 前台传递参数到后台 前台使用ajax 后台使用springMVC 传递的参数是N多个对象 JSON对象和JSON字符串 ...

  5. Compute Shader基础

    ComputeShader:     GPGPU:General Purpose GPU Programming,GPU通用计算,利用GPU的并行特性.大量并行无序数据的少分支逻辑适合GPGPU.平台 ...

  6. 前端AJAX传递数组给Springmvc接收处理

    前端传递数组后端(Spring)来接收并处理: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  7. struts2 传递数组、List、Map

    struts2 传递数组.List.Map jsp文件 数组:     <s:textfield name="ages" value="a1">&l ...

  8. 在ASP.NET MVC中以post方式传递数组参数的示例

    最近在工作中用到了在ASP.NET MVC中以post方式传递数组参数的情况,记录下来,以供参考. 一.准备参数对象 在本例中,我会传递两个数组参数:一个字符串数组,一个自定义对象数组.这个自定义对象 ...

  9. jquery ajax post 传递数组 ,多checkbox 取值

    jquery ajax post 传递数组 ,多checkbox 取值 http://w8700569.iteye.com/blog/1954396 使用$.each(function(){});可以 ...

随机推荐

  1. Xor Sum 01字典树 hdu4825

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  2. SSH免密码登录Linux服务器

    作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=587 操作环境: 客户机操作系统:Ubuntu Linux 服务器操作系统:CentOS Linux 免密登陆的原理: ...

  3. Python定时任务

    在项目中,我们可能遇到有定时任务的需求.其一:定时执行任务.例如每天早上 8 点定时推送早报.其二:每隔一个时间段就执行任务.比如:每隔一个小时提醒自己起来走动走动,避免长时间坐着.今天,我跟大家分享 ...

  4. (一)Servlet简介

    相关名词解释 HTML:Hyper Text Markup Language,超文本标记语言 HTTP:Hyper Text Transfer Protocol,超文本传输协议 URL:Uniform ...

  5. Go 延迟函数 defer 详解

    Go 延迟函数 defer 详解 Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.re ...

  6. HEOI2018 游记

    day0早上没有跑操,收拾了点东西,带了点吃的,老妈打电话说要给送点厚衣服,好像确实有点冷.上午有考试,说自愿考,然后开到一半就没了,根本没人打啊,打了一道小园丁和老司机,一个一个部分分打,最后T了一 ...

  7. 【递推】Bzoj3612[Heoi2014]平衡

    Description 下课了,露露.花花和萱萱在课桌上用正三棱柱教具和尺子摆起了一个“跷跷板”.      这个“跷跷板”的结构是这样的:底部是一个侧面平行于地平面的正三棱柱教具, 上面 摆着一个尺 ...

  8. bzoj 4832 抵制克苏恩 概率期望dp

    考试时又翻车了..... 一定要及时调整自己的思路!!! 随从最多有7个,只有三种,所以把每一种随从多开一维 so:f[i][j][k][l]为到第i次攻击前,场上有j个1血,k个2血,l个3血随从的 ...

  9. ajax封装函数和表单序列化

    //表单序列化function iSerialize(form){ var parts={}; for(var i=0;i<form.elements.length;i++){ var file ...

  10. Hadoop权限管理

    1.Hadoop权限管理包括以下几个模块: (1) 用户分组管理.用于按组为单位组织管理,某个用户只能向固定分组中提交作业,只能使用固定分组中配置的资源:同时可以限制每个用户提交的作业数,使用的资源量 ...