[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组件 用代码调用的话可以这样: assetparm = GameObject.FindObjectOfType(); if (assetparm == null) { string otlpath = "Assets/OTLs/" + hdaname + ".hda"; HoudiniAssetUtility.instantiateAsset(otlpath); asse...
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