- 博客(83)
- 资源 (5)
- 收藏
- 关注
原创 (三)引擎向研究之——————Unity3d中编写工具判断纹理贴图是否是纯色纹理(逐像素判断法和泊松分布法)
我们在项目中有时会发现一些纯色纹理,如下图,纯色纹理顾名思义就是一些单一颜色的纹理贴图,在实际项目中我们是需要把这些剔除掉的,不建议使用纯色纹理。原因:纹理大部分是用来赋予材质在shader中进行采样的,如果使用纯色纹理,我们完全可以在shader中加一个color属性替代纯色纹理采样,tex2D采样的非常消耗性能的。在实际项目中美术同学可能不知道,以至于或多或少我们项目中都存在一些纯色纹理,如果使用过UWA,UWA也可以帮我们检测出来,如下图:下面介绍两种方法批处理美术资源并筛选出来纯色纹
2020-09-24 20:13:18 1526
原创 (二)引擎向研究之——————unity2018.3新Prefab系统的常用API详解
PrefabUtility这个类是主要用到的,我们来看下里面的常用方法是做什么的。一、PrefabUtility.SaveAsPrefabAsset()方法public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath, out bool success);该方法是把一个gameobject保存成预设体,传参go的根节点,保存到哪个路径下,可以返回一个bool值说明是否保存成功,也会返回该.
2020-09-04 11:16:08 1909
原创 (一)引擎向研究之——————unity2018.3之前老Prefab系统的常用API详解
PrefabUtility这个类是主要用到的,我们来看下里面的常用方法是做什么的。一、PrefabUtility.CreatePrefab()方法(2018.3以后弃用)public static GameObject CreatePrefab(string path, GameObject go, ReplacePrefabOptions options);该方法是把一个gameobject保存成预设体,传参go的根节点,保存到哪个路径下,替换预设参数自己选择,返回该预设体的GameObje.
2020-09-04 11:14:51 1814
原创 (四)unity shader在实际项目中出现的问题————安卓机型角色眼镜闪烁的问题(Z-Fighting)
最近发布跑安卓平台游戏的时候,发现我们部分功能界面出现的角色模型,眼镜会一直闪烁,有时候全身都感觉在闪,经常调查,发现这种画面闪烁大多数情况下是z-fighting引起的。解决方案:1.由于我们项目的角色模型有眨眼这个功能,所以会导致,瞳孔的面片和角色模型是分离的面片,这两个面片贴的过劲导致的,所以解决方案之一是让模型产生这个现象的两个面尽量离开一些距离,究竟多少距离只有通过实验才知道。这种方法会对美术产生影响,所以这种方法是下下策。2. 在每个场景中,找到那个MainCamera,然后在.
2020-06-18 14:53:02 1607
原创 (十)unity自带的着色器源码剖析之——————AutoLight.cginc文件(包含一些阴影和光照相关计算的函数)
AutoLight.cginc文件包含了一系列用来进行照明和阴影计算的函数,本篇重点讲述此文件中关于聚光灯和有向平行光的计算原理。一、DIRECTIONAL宏的定义如下:#ifndef AUTOLIGHT_INCLUDED#define AUTOLIGHT_INCLUDED#include "HLSLSupport.cginc"#include "UnityShadowLibrary.cginc"// If none of the keywords are defined, assu
2020-06-02 20:20:38 2725 1
原创 (九)unity自带的着色器源码剖析之——————UnityShadowLibrary.cginc文件分析(实时阴影和烘焙阴影、阴影淡化、阴影渗漏处理、PCF阴影过滤解决实时阴影锯齿)
一、阴影与全局照明系统的关系Unity3D引擎可以根据宏SHADOWS_SCREEN和LIGHTMAP_ON是否启用决定是否在全局照明系统下对阴影进行混合处理。如果这两个宏同时启用,则HANDLE_SHADOWS_BLENDING_IN_GI定义为1,即宣告在全局照明下也对阴影进行处理。宏SHADOWS_SCREEN本质上是一个着色器多样体,表示是否在屏幕空间中处理阴影计算,如下所示:#...
2020-05-18 12:28:09 4194 4
原创 (八)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:下篇(unity3D中的球谐光照和SH球谐函数、unity实时阴影抗锯齿解决方案)
一、探针基于球谐函数的全局光照球谐光照是基于预计算辐射度传输理论实现的一种实时渲染技术。预计算辐射度传输技术能够重现在区域面光源照射下的全局照明效果。这种技术通过在运行前对场景中光线的相互作用进行预计算,计算每个场景中每个物体表面点的光照信息,然后用球谐函数对这些预计算的光照信息数据进行编码,在运行时读取数据进行解码,重现光照效果。球谐光照使用新的光照方程来代替传统的光照方程,并将这些新方...
2020-04-23 20:21:31 2184
原创 (七)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:中篇(光照探针和反射探针)
一、光照探针照明的细节1.1 光照探针照明概述使用光照贴图可以大幅度提升场景渲染的真实程度,但缺点是光照贴图无法作用在非静态的物体上,所以看上去运动的物体和场景就显得恨不协调。为了解决这个问题,使用光照探针(probe lighting)技术模拟使用光照贴图的效果。光照探针大致原理:在某一光照探针的所在位置点上对光照信息进行采样,然后从该光照探针相邻的其他光照探针的位置上对光照信息进行采...
2020-04-23 20:04:15 1900
原创 (六)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:上篇(全局照明GI和局部照明)
一、全局照明和局部照明全局照明(global illumination,GI)是用于向三维场景中添加更为逼真的光照效果的一组算法总称。全局算法不仅考虑光源发出的光与被照亮物体之间的关系,即直接照明(direct illumination),还考虑光线从某一物体的表面传递到另一个物体的表面时的关系,即间接照明(indirect illmination)。而局部照明(local illuminat...
2020-04-23 19:50:54 1707
原创 考察专题
实际复杂问题:1.GUI Instancing移动平台合批:graphics->Instancing Variants 选为keep all。官方文档指出stripUnused选项会在build(这个build应该指的是打包,不知道为何打Bundle包时候也会受此影响)时保留至少有一个材质(勾选了enable instancing的)关联的Instancing shader,而没有...
2020-04-09 17:12:01 362
转载 Unity移动端性能优化(转)
在知乎上看到一篇不错的性能优化文章,进行了比较系统的概括,下面分享一下,原文地址:https://zhuanlan.zhihu.com/p/260302521.渲染利用reflect probe代替反射、折射,尽量不用RTT、GrabPass、RenderWithShader、CommandBuffer.Blit (BuiltinRenderTextureType.CurrentAct...
2020-03-25 16:07:18 2257
原创 (四)unity自带的着色器源码剖析之——————Unity3D 多例化技术(GUI Instancing)
一、多例化技术概述假设需要绘制有很多模型的场景,而大部分模型使用的是同一个模型,即使用同一组顶点数据在渲染时会给它们指定不同的世界坐标,绘制在不同位置上。比如草,可能由几个三角形构成,渲染一株草没有渲染压力,但是成千上万株就会调用相应次数绘制调用(draw call)就会极大影响性能。1.1 不使用GPU多例化技术绘制多个相同模型如果这样绘制同一模型大量实例(instance),很快就...
2020-02-25 16:35:31 3808
原创 (三)unity自带的着色器源码剖析之——————UnityCG.cginc文件(下篇:法线贴图及编解码操作函数、线性化深度值函数、计算屏幕坐标工具函数、阴影处理相关函数、雾相关函数等)
八、法线贴图及其编解码操作的函数法线贴图存储的信息是对模型顶点法线的扰动方向向量,利用此扰动方向向量,在光照计算时对顶点原有的法线进行扰动,从而使法线方向排列有序的平滑表面产生法线方向杂乱无序从而导致表面凹凸不平的效果。要在Unity3D中导入和使用法线贴图,要设置为Normal map类型,是因为在不同平台上,Unity3D可以利用该平台硬件加速的纹理格式对导入的法线贴图进行压缩,同时也...
2020-02-01 18:02:51 2636 1
原创 (二)unity自带的着色器源码剖析之——————UnityCG.cginc文件(上篇:数学常数、颜色空间常数和函数、顶点布局格式结构体、进行空间变换的函数、HDR级光照贴图编解码相关函数等)
一、数学常数unity3D内置着色器定义了一系列的数学常数,如下:从第3行开始,第13行结束:#ifndef UNITY_CG_INCLUDED#define UNITY_CG_INCLUDED#define UNITY_PI 3.14159265359f //圆周率#define UNITY_TWO_PI 6.28318530...
2020-01-31 13:25:53 1902
原创 (一)unity自带的着色器源码剖析之——————UnityShaderVariables.cginc文件
unityShaderVariables.cginc文件中包含大量的工具宏和函数,如变换操作用的矩阵、与摄像机相关的函数、与光照和阴影相关的函数,以及与雾效果相关的函数等。下面依次分析这些工具函数和宏。一、进行变换操作用的矩阵1.1 判断 USING_DIRECTIONAL_LIGHT宏是否定义并分析与立体渲染相关的宏代码段如下,从第3行开始,14行结束:#ifndef U...
2020-01-06 15:44:09 2549 1
原创 (三)unity shader在实际项目中出现的问题————部分机型(如三星Note9)在某场景实时阴影闪烁问题
本专栏主要解决一些移动平台上unity shader效果异常的问题。很多情况下我们发现unity中的shader在PC平台效果正常,但是在移动平台上效果不对,或者部分机型效果不对的问题,尤其是低档老年机,作为一款上线游戏难免要支持高中低档大部分机型,但是部分机型(如华为)在渲染方面难免会出现很多奇怪的问题。最近在用三星note9跑我们手游的一个场景时(这个场景比较大,而且分为很多层楼),在...
2020-01-01 15:02:40 1299
原创 (二)unity shader在实际项目中出现的问题————低档机(如小米4)切换游戏场景时花屏问题
本专栏主要解决一些移动平台上unity shader效果异常的问题。很多情况下我们发现unity中的shader在PC平台效果正常,但是在移动平台上效果不对,或者部分机型效果不对的问题,尤其是低档老年机,作为一款上线游戏难免要支持高中低档大部分机型,但是部分机型(如华为)在渲染方面难免会出现很多奇怪的问题。最近在测试低档机(如小米4)的游戏性能的时候,切换场景发现会花屏一会,但在编辑器运行...
2019-12-28 16:05:58 1690
原创 (三十一)unity shader之——————透明和半透明材质
一、半透明材质SSS(sub-Surface Scattering,3S)的中文意思是次表面散射或称半透明材质。它适用于表现各种有次表面反射的材质,如透明橡胶、有机玻璃或玉石等。因为实时渲染是不可能做大量的运算来计算光的折射和反射的,所以SSS属于比较高级的材质范畴。二、化繁为简要实现半透明材质,许多方法都进行了大量的运算,比如正弦、余弦的计算、指数的运算等,外加各种贴图和通道的混合,...
2019-12-27 17:05:18 7667 1
原创 (三十)unity shader之——————分割物体效果(着色器分割物体的方法)
在很多打斗游戏中,经常能看到物体被撕碎或者打破的效果,这种效果比较直观,可以通过分割一个网格来实现,即在原来网格基础上,再算出一个新的网格,本章将介绍一种通过着色器分割一个物体的方法。一、分割一个物体的思路1.1 我们需要什么样的信息分隔一个物体,需要知道刀刃的碰触点和方向,这样就能确定一个剪切平面了。其次,需要两个通道来渲染物体,这两个通道用同样的平面和方式剪切。最后,需要构...
2019-12-26 17:29:03 3152 1
原创 (二十九)unity shader之——————着色器的组织和复用(cginc文件复用代码、宏定义和shader变体、自定义材质编辑器)
一、cginc文件1.1 unity的UnityCG.cginc文件我们经常使用#include 指令包含UnityCG.cginc。这个文件中包含了unity预定义的大量结构和函数,通过#include指令可以复用这些结构和函数,而不必每次都重新定义它们。1.2定义自己的cginc文件我们可以定义自己的cginc文件,然后用#include指令包含该文件,实现着色器代码的复用。虽...
2019-12-26 15:25:55 2209 1
原创 (一)unity shader在实际项目中出现的问题————unity的后处理插件景深效果在某些低档机(如三星)无效的解决方案
本专栏主要解决一些移动平台上unity shader效果异常的问题。很多情况下我们发现unity中的shader在PC平台效果正常,但是在移动平台上效果不对,或者部分机型效果不对的问题,尤其是低档老年机,作为一款上线游戏难免要支持高中低档大部分机型,但是部分机型(如华为)在渲染方面难免会出现很多奇怪的问题。最近在做一个小游戏,用到了景深后处理效果,然后发现在一个三星的低端机景深没有效果,...
2019-12-25 17:22:32 3458 1
原创 (二十八)unity shader之——————基于光照贴图(lightmap)的烘焙详细介绍
光照贴图(Lightmap)是一种效果明显的模拟光照的方法,这种光照贴图需要提前渲染,因此可以应用在静态效果图中,属于全局照明技术。但是这种方法一般只适用于静态物体。当然unity做了很多工作,可以让我们混合使用静态光照贴图和动态实时光源,无缝地照亮场景中静态或动态的物体。注意,受到光照贴图的影响的物体只能在静态物体上合并批次渲染。动态和GPU Instancing两种合并批次的方式unit...
2019-12-25 14:50:11 3432
原创 (二十七)unity shader之——————基本的渲染概念
一、逐顶点计算和逐像素计算1.1逐顶点计算在vertex函数中进行的计算就叫逐顶点计算,该计算量只和模型的顶点数量或面的数量有关,而和其他因素(如模型在屏幕上的大小)无关。在unity的表面着色器中,逐像素的计算发生在vertex:vertexfunction所确定的函数中。1.2逐像素计算在fragment函数中进行的计算就叫逐像素计算,这个计算量和模型的具体顶点数量以及面数无关...
2019-12-19 14:02:47 412
原创 (二十六)unity shader之——————面积光:下篇(面积光源)
一、面积光源1.1面积光和线光源的不同面积光其实就是一个长方形光线,是所有几何形体中最易计算的一类面积,这个例子中,面积光和线光源最大的不同是,面积光把空间分成了更多的区域。如果不考虑光源法线,一个长方形的面积光会把空间分成9个区域,共4种类型的照明条件。因此,对于面积光的计算,主要就是确定点落在了这9个区域内的哪一个区域,并使用相应的照明条件计算点的光照。1.2通过脚本设定面积光的几...
2019-12-15 23:53:39 1077
原创 (二十五)unity shader之——————面积光:上篇(线光源)
面积光是具有形体的一类光源,不像点光源和平行光这类完全抽象化,没有形体的光源。面积光适用于表达柔和的自然光,如通过灯发出的光具有明显的几何形体光源。unity实现了面积光,但仅用于灯光烘焙,而在实时渲染中仍然无法使用面积光。下面将通过着色器计算来实现面积光。一、线光源1.1点、线、面两个点可以确定一条直线,而两个相互垂直的线段可以确定一个矩形,6个面可以构成一个立方体。而这里,对面光源...
2019-12-14 17:11:24 1518 3
原创 (四)unity中的渲染优化技术——————(游戏物体、UI、模型的优化,以及移动平台的一些优化)
一、渲染优化的元素和渲染优化相关的东西很多,大致可分为网格、着色器材质、光照和阴影。相关的优化技术有相机视椎体剔除、遮挡剔除、基于层的分类剔除与合并绘制调用。LOD降级分为着色器的LOD降级和LodGroup降级。在所有这些方面地形是比较特殊的,假设使用的是unity的地形,可以将这些与性能优化有关的元素整理成下图:1.1 小型物体的优化小型物体不能像一堵墙或桌子那样提供遮蔽,按...
2019-12-07 14:14:31 1863 2
原创 (三)unity中的渲染优化技术——————(节省带宽、减少计算复杂度)
一、节省带宽大量使用未经压缩的纹理以及使用过大的分辨率都会造成由于宽带而引发的性能瓶颈。1.1减少纹理大小使用图集可以帮助我们减少draw call数目,而这些纹理的大小同样是一个需要考虑的问题,所有纹理的长宽比最好是正方形,而且长宽值最好是2的整数幂,这是因为有很多优化策略只有在这种时候才可以发挥最大效用,在unity5中,即便我们导入的纹理长宽值并不是2的整数幂,unity也会自动...
2019-11-09 14:43:00 2344
原创 (二)unity中的渲染优化技术——————(减少需要处理的顶点和片元数目)
一、减少需要处理的顶点数目顶点数目同样有可能成为GPU的性能瓶颈,下面给出3个常用的顶点优化策略。1.1优化几何体建模时尽可能减少模型中三角面片的数目,一些对于模型没有影响、或是肉眼非常难察觉到区别的顶点都要尽可能去掉。美术人员往往需要优化网格结构。很多三维软件都有相应的优化选项,可以自动优化网格结构。在unity渲染统计窗口中可以查看到渲染当前帧需要的三角面片数目和顶点数目。需要...
2019-11-08 17:56:14 1820
原创 (二)unity中的渲染优化技术——————(减少draw call数目 方法二:静态批处理、共享材质、批处理的选择)
一、静态批处理相比于动态批处理来说,静态批处理适用于任何大小的几何模型。它的实现原理是,只在运行开始阶段,把需要进行静态批处理的模型合并到一个新的网格结构中,这意味着这些模型不可以在运行时刻被移动。但由于它只需要进行一次合并操作,因此比动态批处理更加高效。静态批处理的缺点在于,它往往需要占用更多的内存来存储合并后的几何结构,这是因为,如果在静态批处理前一些物体共享了相同的网格,那么在内存中每一...
2019-11-07 17:38:30 915
原创 (二)unity中的渲染优化技术——————(减少draw call数目 方法一:动态批处理)
批处理的实现原理就是为了减少每一帧需要的draw call数目。为了把一个对象渲染到屏幕上,CPU需要检查哪些光源影响了该物体,绑定shader并设置它的参数,再把渲染命令发送给GPU。当场景中包含了大量对象时,这些操作就会非常耗时。一个极端的例子是,如果我们需要渲染一千个三角形,把他们按一千个单独的网格进行渲染所花费的时间要远远大于渲染一个包含了一千个三角形的网格。在这两种情况下,GPU的性能消...
2019-11-06 00:26:03 1081
原创 (一)unity中的渲染优化技术——————(影响性能的因素、unity中的渲染分析工具)
这个专栏我们会阐述一些unity中常见的优化技术,这些技术基本都是和渲染相关的,例如使用批处理、LOD(Level of Detail)技术等。游戏优化不仅是程序员的工作,更需要美工人员在游戏的美术上进行一定的权衡,例如避免使用全屏的屏幕特效,避免使用计算复杂的shader,减少透明混合造成的overdraw等。这是由程序和美工人员等各部分人员共同参与的工作。一、移动平台的特点和PC平...
2019-11-05 15:00:49 1537
原创 (二十四)unity shader之——————使用噪声:下篇(水波效果)
在模拟真实水面过程中,我们往往也会使用噪声纹理。此时噪声纹理通常会用做一个高度图,以不断修改水面的法线方向。为了模拟水不断流动的效果,我们会使用和时间相关的变量来对噪声纹理进行采样,当得到法线信息后,在进行正常的反射+折射计算,得到最后的水面波动效果。本篇文章会使用一个噪声纹理得到的法线贴图,实现一个包含菲涅耳反射的水面效果,如下图:我们使用一张立方体纹理(cubemap)作为环境纹理...
2019-11-04 17:58:18 1883
原创 (二十三)unity shader之——————使用噪声:上篇(消融效果)
很多时候向规则的事物里添加一些“杂乱无章”的效果往往会有意想不到的效果,这些效果的来源就是造成,我们会学习使用噪声来模拟各种看似“神奇”的特效。一、消融效果消融效果常见于游戏中角色死亡、地图烧毁等效果。在这些效果中,消融往往从不同的区域开始,并向看似随机的方向扩张,最后整个物体都将消失不见。效果类似如下:实现原理概况来说就是噪声纹理+透明度测试。我们使用对噪声纹理采样的结果和某个控...
2019-11-03 16:03:46 882
原创 (二十二)unity Shader——————非真实感渲染:下篇(素描风格的渲染)
另一个非常流行的非真实感渲染是素描风格的渲染。有篇著名的论文中提到过,使用了提前生成的素描纹理来实现实时的素描风格渲染,这些纹理组成了一个色调艺术映射,这些纹理笔触逐渐增多,用于模拟不同光照下的漫反射结果,从上到下对应了每张纹理的多级渐远纹理,这些纹理的生成并不是简单的对上一层纹理进行降采样,而是需要保持笔触之间的间隔,以便更真实的模拟素描效果。本节我们使用6张素描纹理进行渲染,在渲染阶段首先...
2019-11-01 18:20:32 797
原创 (二十二)unity Shader——————非真实感渲染:上篇(卡通风格的渲染)
尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面。非真实感的一个主要目标是,使用一些方法使得画面和某些特殊的绘画风格相似的效果,例如卡通、水彩风格等。一、卡通风格的渲染卡通是游戏中常见的游戏画面有一些共有的特点,例如物体都被黑色的线条描边,以及分明的明暗变化等。要实现卡通渲染有很多方法,其中之一就是使用基于色调的着色技术。我们往...
2019-10-24 16:50:07 1310
原创 (二十一)unity Shader——————shader中的动画效果:下篇(顶点动画)
顶点动画可以让我们的场景变得更加生动有趣。在游戏中,我们常常使用顶点动画来模拟飘动的旗帜,河流的效果。下面将学习两种常见的顶点动画应用:流动的河流以及广告牌技术,最后还给出一些顶点动画中的注意事项以及解决方法。一、流动的河流河流的模拟是顶点动画最常见的应用之一。原理通常是使用正弦函数等来模拟水流的波动效果。本节会展示如何模拟一个2D的河流效果。1.声明属性:Propertie...
2019-10-22 23:57:57 1146 2
原创 (二十一)unity Shader——————shader中的动画效果:上篇(纹理动画)
本篇文章将会向unity shader中引入时间变量,以实现各种动画效果。一、unity shader中的内置变量(时间)动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可以随之变化。unity shader提供了一系列关于时间的内置变量来允许我们方便地在shader中访问运行时间,实现各种动画效果。后面会使用上述时间变量实现纹理动画和顶点动画。二、纹理动画...
2019-10-22 00:02:40 870
原创 (二十)unity shader之——————基于物理的渲染技术(PBS):下篇(PBS技术拓展:全局光照、伽马校正、HDR)
前面两篇文章我们介绍了PBS实现的数学和理论基础,和standard shader的原理和实现,还有一些其他的渲染相关的unity技术。其中有些概念和技术没有讲的很详细,现在对这些重要的概念进行更深入地解释。一、什么是全局光照全局光照对得到真实的渲染结果有着举足轻重的作用,全局光照指的就是模拟光线是如何在场景中传播的。他不仅会考虑那些直接光照的结果,还会计算光线被不同的物体表面反射产生的间...
2019-10-20 16:30:38 1082
原创 (十六)unity shader基础之——————基础纹理:下篇(渐变纹理、遮罩纹理)
一、渐变纹理一开始我们在渲染中使用纹理是为了定义一个物体的颜色,但后来发现纹理可以用于存储任何表面属性。一种常见用法就是使用渐变纹理来控制漫反射光照的结果。在计算漫反射光照时,我们都是使用表面法线和光照方向的点积结果与材质的反射率相乘得到表面的漫反射光照。有时我们需要更加灵活的控制光照结果。有一篇论文提出了一种基于冷到暖色调的着色技术,用来得到一种插画风格的渲染结果。使用这种技术,可以保证...
2019-10-19 17:16:27 611
一款防止计算机强制进入睡眠(锁屏)的小工具
2019-08-29
builtin_shaders-2018.2.2f1.rar
2019-08-29
shaderforge支持unity2018的源代码和插件
2019-01-04
unity小工具——查询unity指定目录下的所有图片资源并取消掉mipmap选项的勾选
2018-07-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人