Unity ECS, Swarm Animation and Markov Chain| ECS集群动画与马尔可夫链

交通模拟的项目,要添加大量的行人,自然想到的肯定要用Animation Instancing。其主要思路是把骨骼动画烘焙成贴图,skinning状态是per instance的,在vertex shader中读取animation texture做skinning运算。笔者这里有几点不同。 视角更远,甚至都没必要做骨骼蒙皮,直接用顶点动画即可 动画状态机没有gameplay逻辑,是一个随机过程就好 UnityAustinTechnicalPresentation提供了一个ECS的集群动画案例,虽然其代码已经编译不出来了,但是通过阅读源码可以了解其大致逻辑 启动时将骨骼动画数据烘焙成动画贴图 gameplay逻辑中更新状态ID,这部分相当于hardcode的状态机。Job里面目测没法反射或者模板,animator自然是不能用...
Read More

Construct BVH with Unity Job System | 用Unity JobSystem构造BVH

BVH 是一种空间存储数据结构,便于空间查询。类似的空间查找方法还有BSP,Octree等等。 BVH的构造/查询比较快,空间冗余也比较少,在实时图形学领域用的比较广泛。比如NVidia的RTX技术,就是硬件固定管线实现了BVH便于RayTracing加速。 构造BVH或其它空间查询结构对于渲染剔除,物理计算,粒子/boid/swarm系统通信等等都是很重要的,ECSPhysics这个项目是实现了BVH的,不过抄完测了一下感觉这个BVH构造的不对啊。于是找到BVH有并行算法实现,非常适合用Unity JobSystem多线程构造。于是基本参考了Thinking Parallel, Part III: Tree Construction on the GPU这篇经典文章自己在Unity中实现。 构造BVH的基本流程:1. 构造Z-Order 2. 排序 3 构造子节点 ...
Read More

Splat with 256 Texture – Review on MegaSplat | 256套贴图混合地形-MegaSplat回顾

最近看到MegaSplat这个插件感觉很有意思,在这里做一介绍。作者Jason Booth是有二十多年经验的程序员,现在是Disruptor Beam工作室的客户端和图形架构师,最近unity官方博客还推了行尸走肉:行军作战移动端优化经验,便是这位大神所写 MegaSplat是一套地形的shader,支持很多的feature,另外有写的很好的顶点色绘制工具,shader编译代码,以及最重要的,用顶点混合256张贴图的方法。 雪的混合,代码在DoSnow函数中,基本思路是用height和ao来生成一个snowAmount,这个snowAmount来lerp颜色法线等等 比如还有岩浆,下图是unity截图,在DoLava函数中 比如还有小溪, 在DoPuddle里,会有泡沫和水波涟漪的计算,另外还会用法线重采样原有地形贴图造成折射效果 另外还有te...
Read More

[Translate] Foliage Optimization in Unity | [译] Unity中植被渲染优化

原文在此,下为译文 在我上篇博客——创建森林的美术建议中,我指出了创建3D森林的一些要点。那里我主要强调的是美术建议,资源应该有什么、如何布置。森林一个重要的事情是密度,随之而来的问题是性能优化。 问题 有很多方式优化树林,但如何来创建资源,通用的不多。然而,有一件事是通用的,那就是关注drawcall。 虽然面数也很重要,但不那么复杂。只需要设定一个合理的目标。下面是我们的资源的一些面数。如果你需要很多的透明插片来达到想要的效果,你需要提高贴图中叶子的占用率。 最后,是OverDraw。如果你有很多重叠的透明物体。我不太会关注这个,因为其实我也不知道怎么办。我会修改树的轮廓减少重叠。但是美术效果更加重要。但让树林真实还得考虑overdraw太难了。我只关注了面数和drawcall。 计划 如果你希望发现unity的一些隐藏参数,可以来...
Read More

Call Houdini Engine in Unity | Unity中调用Houdini Engine

在Unity中调用Houdini Engine是可以的,不过如果直接拖进场景,然后bake,其实不太好管理的。mesh叫啥不太好控制。但是如果用代码调用Houdini Engine,就可以进行一系列自动化操作,而且不用担心手动操作管理混乱的问题。 HDA可以直接拖进场景。拖进去以后有一个HoudiniParms的组件,组件里显示的就是HDA的面板。 实例化HDA组件 用代码调用的话可以这样: HoudiniAssetUtility.instantiateAsset(hdapath); 其中,hdapath是hda的路径这就相当于把HDA拖进场景了。然后可以用GameObject.FindObjectOfType找到HoudiniParms类型的组件,命名为assetparm,我们之后修改参数也是改它。 有几种参数:字符串,float,int/...
Read More

Realtime Grass Rendering on Mobile Platform| 移动端实时草地渲染

有很多很多不同的技术了。 题图是一个人的demo,Real-Time Grass Rendering,跟我没啥关系 要渲草的话,OpenGL ES2.0/DX9及以下就不用考虑了。至少要支持GPU Instancing,有Compute Shader更好。 理想平台:OpenGL ES3.1/Metal/Vulkan 1. Rendering Countless Blades of Waving Grass GPU Gem上的文章,链接在这里 主要思路: 1. 贴图 一张alpha-test的贴图 2. 插片 3. 风 为了避免变形扭曲和减少drawcall,定点要记录每个草的中心位置,根据中心位置做随机偏移 主要意义在于提出了草插片,不过其他都没啥考虑。   2. Rendering Grass in Real Ti...
Read More

Mixed Lighting Lightmap & Shader in Unity | Unity中混合光照Lightmap研究

Unity中有三种灯光模式:Realtime Lighting, Mixed Lighting, Baked Lighting. 第一种是实时计算的,第二种是实时与烘焙混合的,第三种所有灯光都是烘焙的。 在Mixed Lighting中处理Lightmap的同时还要考虑实时灯光,Shader上会复杂一点。并且Mixed Lighting中有三种模式:ShadowMask, Bake Indirect和Subtractive,三种模式的Lightmap定义不一样,这就很尴尬了。那么首先介绍一下这几种模式: Bake Indirect 烘焙直接阴影,只烘焙间接光,在Shadow Distance(Project Settings>Quality>Shadows里面设置)之内的阴影都是实时计算的(Shadow Map)。 所谓间接光,就是物体之间互相反射的那些光,也包含A...
Read More

Transfer Lightmaps in Unity | Unity中转移光照贴图

unity中光照贴图(lightmapping)的存储方式比较特殊,烘焙好的光照贴图存储在场景中,而参与烘焙的物体本身不记录光照贴图,只记录一组uv数据对应光照贴图。在显示的时候,shader通过这组uv坐标访问物体的光照贴图信息,再显示出来。 并且这些光照贴图没法用手动编辑,只能写脚本编辑。 而相对应的如果不在unity中烘焙,而在maya中烘焙,就是一张lightmapping放在shader的自发光贴图里面了。 所以问题在于,在unity中一个场景里烘焙的物体很难带着光照贴图放到另一个场景里。如果我们非要这么干,就得给被烘焙的Prefab加个脚本,记录光照贴图,在加入其它场景中重新加载光照贴图。 1. 光照贴图访问 首先是要访问一下Prefab里面所有子物体,从根节点遍历一下这个树就可以了,非常简单就不提了。 烘焙过的物体会有一个光照贴图的uv信息,以及所使用的...
Read More

Transformation in ShaderLab | ShaderLab中的空间变换

写Shader经常会碰到一堆得空间变换,而又经常想不起来变换矩阵的名字,因此整理一下。 1 物体空间(Object Space), 顶点着色器接收的语义项比如POSITION, NORMAL, TANGENT都是在这个空间下 2 世界空间(World Space) 3 观察空间(View Space),以摄像机为原点 4 裁剪空间(Clip Space),裁剪空间,最常用的UNITY_MATRIX_MVP就是转换到这个空间 5 切线空间(Tangent Space),用了法线贴图就会涉及这个空间 关系到空间的转换,所以有5C2=10类。 再加上物体和世界空间中都有可能访问两种固定的类型,比如灯光,视线。 1. 物体空间-世界空间(1-2) 以前叫_Object2World,新版本改叫unity_WorldToObject了,其逆变换为unity_ObjectToWo...
Read More