tutorials

Difference between Texture Array and Texture Atlas (simplified version)

在Unity 做Rendering相关优化时不得不使用TextureArray 。这是因为Unity里为了减少 DrawCall 而使用的 Batching。简单来说新画的material和Mesh种类越多,DrawCall 就会越多。但是 DrawCall 不便宜,会消耗很大的CPU性能。所以Unity 会自动进行 Batching 。使用同样的material就会自动捆绑,使用同样的Mesh也会自动捆绑。所以 Batching 跟 DrawCall 次数是一样的概念。 为了减少 Batching 的次数,减少material的方法对应的就是 TextureArray 。比这个还常用的方法是 TexutreAtlas ,但这种方法很单纯。在一张贴图上添加所有图片,修改UV的时候才会用。一般是在UI 图片上设置Sprite的时候会用到, Unity有一种把 Sprite合并在UGUI 功能上做成 TextureAtlas 的功能。但是3D 物体的UV 就不一样了。UV 坐标是 0和 1之间的值组成的,如果想把很多张贴图设置在一起的UV坐标合并在一起重新设置的话会非常麻烦。如果合并前的贴图在合并后又增加的话就更麻烦了。这样最终就成了生产效率的问题,所以会用其他方法,而这个方法就是 TextureArray 。 TextureArray的概念很简单,是把贴图按列进行捆绑,只要有Index就可以一个个参考使用。就是说跟UV的2D坐标一起,再有一个Index就可以。TextureArray的优点是,不会跟TextureAtlas一样需要一直合并和修改UV,只要根据 Mesh设置Index就可以很容易操作。而且不管贴图的数量是多少, material 可以维持一个的状态所以很便捷。但是要用在Unity有几个缺点。因为不支持Asset生成,所以很麻烦,显示的GUI在Unity内部也是不支持的。为了使用起来方便,需要亲自编辑代码。当然直接生成也没关系,但考虑生产效率的问题就不是很好了。而且Shader代码也要亲自替换,有很多需要设置的地方。所以很贵。 现在适用到 Unity 里看下。 需要做的有三件事。 把Mesh 里的简单的2D UV坐标 换成持有(UV + Texture Index)坐标的3D坐标。 生成TextureArray并适用 在Shader […]

对Reflection的误解(漫反射&镜面反射)

jplee23年的游戏开发商。 技术美术总监。 渴望退休的独立开发商。半灰、max、游丝结、戏剧常量、熊掌等 6 人赞同了该文章 Written by JP.Lee心动的 Technical art team leader.leegoonz@163.com 对Reflection的误解(漫反射&镜面反射) 字面含义 我们通常使用diffuse reflection(漫反射 ) 和 specular reflection( 镜面反射 ) 这两种术语。但真的懂得其含义吗? 首先来看看diffuse的字面含义。 1.散开;四散 ( 光, 热量, 味道等 ) 2. […]

Tile Based Deferred Rendering

Written by JP.Lee心动的 Technical Art team leader. Immediate ModeRendering (IMR) 把三角形Rasterizing,以像素(pixel)为单位进行Shading的传统方式。三角形通过流水线及时移动。耗电以及浪费memory bandwidth(Early Visibility Test功能:为了使用这个功能,三角形要以序列的方式进入。因此,应在应用部分将三角形进行分类(sorting)。 Tile BasedRendering (TBR) 在Embedded中成本最高的是内存的读写。内存的读写与电量和memory bandwidth密切相关。所以在Embedded中最有效的优化方法之一是减少内存访问的次数。TDR度为了取代以前使用的将在IMR中的可见三角形挑选出来的Z-buffer(depth buffer)而研发的方法。将要渲染的画面分成许多tile,以tile为单位进行rasterization。(根据不同的系统情况,存在同时移动的tile。但是不是所有的三角形都能及时通过流水线进行移动。)(每一次划分tile的时候,硬件会创建包括各tile在内的有关Geometry列表的指针。使得各个tile在进行渲染的时候,都可以获取相关的Geometry buffer。)这样不使用z-buffer,改用tile进行处理的话,只使用在system-memory上的intermediate buffer 就可以解决了。 Tile BasedDeferred Rendering (TBDR) TDR的改良版本。在TDR里也可以对看不见的部分进行Shading或贴图(Texture Mapping)。在TBDR中,GPU里面通过分类找出三角形排列顺序,可以去掉不可见的部分)这个方法称为Hidden Surface […]

About mobile SOC

Written by JP.Lee心动的 Technical Art team leader. 与PC游戏开发不同的是,Mobile device的硬件种类繁多,差异较大。 对于我们而言,最重要的是积累开发Mobile device的经验。 例如,进行各种硬件优化,QA 和QT,以及整个开发工程中不可或缺的Automatic build system,还有为了让绘图颜色看起来更美观的各种Shader技术。 这一章主要介绍了游戏策划人员,艺术家,游戏图形程序员,游戏引擎开发人员应该具备的相关知识。 普通AP的架构 AP原来是指用电池驱动的,专门为Mobile Embedded Computing设计的CPU。早期,其安装在notebook/netbook/UMPC和PDA等便携式PC上。现在,AP(Application Processor)安装在智能设备的SoC上,已经成为了mobile process的代名词。 AP 包括了CPU和GPU核心,其运行操作系统和应用程序,具有control附近Chipset的function。▶一般而言,AP由CPU,处理2D/3D图形的GPU,ISP(Image Signal Processor),multi format video codec, 运行audio […]

VECTOR REJECTION DERIVATION

VECTOR REJECTION DERIVATION Written by JP.Lee心动的 Technical Art team leader. VECTOR REJECTION 制作 Vector Rejection 函数。 Shader forge 里有 Vector rejection 内置函数。 但是 Amplify shader editor 里没有,所以要用 Custom expression 制作 […]

Create maxscript threads by separating them

Create maxscript threads by separating them Written by JP.Lee心动的 Technical Art team leader. Max脚本通常表现为单线程。 因此,如果您有大量计算,则必须等待一会儿才能运行。 或者,您不能同时激活多个功能。 如果您通过分离线程来工作,则可以解决上述情况。 线程分开意味着您可以单独使用CPU的内核。 这是通过利用Windows支持的DotNet功能来完成的。 仅仅因为您可以分离线程并不意味着您可以对所有代码进行多线程处理。 但是,任何影响Max的区域都可能由于线程摄入它而引起问题。 这是一个冲突。 例如,我在线程A中创建了一个盒子,但线程B删除了它,但是线程A再次找到了该盒子 可能会发生这种情况,如果可能,最好单独使用这些功能。 它应用于与Max一起使用的其他功能,或用于完全独立的功能,例如使用Max-script连接到网络。 Max-script typically behaves as a […]