Unity3D
文章平均质量分 90
Unity3D
Jaihk662
这个作者很懒,什么都没留下…
展开
-
离屏粒子优化
粒子特效一直是一个游戏开发中非常吃性能的点,特点就在于①数量不固定,在极端情况下同时存在的特效数量特别多,不且好合批;②其往往都为半透明物体,混合方式各有不同,同一个 pixel 可能会叠好几层特效。最后带来的结果就是:①大量的 DC,CPU 端优化不下去;②过多的 overdraw 也会带来 GPU 上的压力。而一种比较传统的优化方式就是离屏渲染:即将所有的粒子渲染到一张更低分辨率的 RT 上,并在后处理前把它混合回主渲染目标上,这可有效缓解②带来的性能问题原创 2024-06-04 16:05:52 · 960 阅读 · 0 评论 -
Unity 如何制作和发布你的 Package
Unity Package 不做过多赘述,像 URP 本质上也是一个 Package,在 Unity 中可以通过菜单栏 → Window → Package manager 来管理你当前的所有 Package,本篇文章主要介绍:如何制作并发布属于你的 Package原创 2024-04-23 17:40:02 · 3166 阅读 · 0 评论 -
移动平台实时动态多点光源方案:Cluster Light
对于移动平台 Forward 管线,如何支持场景中大量的实时点光源一直以来都是比较棘手的问题,因此,基于空间划分后分块计算光照的思路就应运而生,其可以在保证效果的同时减少 PixelShader 的计算量,大体思路也很简单原创 2024-03-29 18:46:14 · 1102 阅读 · 0 评论 -
UnityShader17.2:ESM 阴影技术(下)
接上文:UnityShader17.1:ESM 阴影技术(上),本文主要介绍如何一个大型 URP 项目中应用 ESM 及 VSM原创 2024-01-18 20:26:56 · 280 阅读 · 0 评论 -
Renderer 使用材质分析:materials、sharedMaterials 及 MaterialPropertyBlock
Unity 开发时,在 C# 中通过 Renderer 取材质操作是非常常见的操作,Renderer 有两种常规获取材质的方式:.sharedMaterials 和 .materials,当然,除了 clone material instance 来做表现差异化,Unity 更希望你用 MaterialPropertyBlock,这个才是做材质表现差异化的正确路子原创 2023-02-17 01:55:57 · 4660 阅读 · 3 评论 -
UnityShader35:光晕光效
光晕(halation)是指在曝光拍摄过程中,强光投射到胶片上时,透过胶片乳剂中在片基表面进行反射,从而致使图像发晕的现象原创 2023-02-13 21:16:55 · 3531 阅读 · 0 评论 -
UnityShader17.1:ESM 阴影技术(上)
这个方法非常好理解,也很朴素:既然采样一个点计算阴影不够,我就把周围的点都给你采样一遍,然后对结果求个平均,不过这有个很严重的问题:多重采样非常影响性能,单次采样的开销取决于 GPU 是否支持 Pre-Fetch Texture 和这个采样是否是 Simple Texturing(不依赖其他采样结果的采样),但无论单次采样效率如何,多重采样在算法层面效率就低下,其总体复杂度是。原创 2022-10-13 19:44:38 · 1261 阅读 · 0 评论 -
EarlyZ 与 DepthPrePass
TBR 和 TBDR 架构网上的文章实在太多了,并且不同的硬件,内部具体的实现原理都不太一样(例如 Early-DT 的实现技术对于 PowerVR 是 Hidden Surface Removal (HSR),对于 Adreno 是 Low Resolution Z (LRZ)……)更何况细节,虽说这些都不算机密,但是也不是说你想拿到就拿到,除非是像。原创 2022-09-29 16:56:10 · 1876 阅读 · 5 评论 -
投影矩阵、NDC 空间与 Reversed-Z
也就是说,OpenGL 平台的投影矩阵会和其它平台不一样,而几篇经典的文章()都是推的 OpenGL 的投影矩阵:而对应 D3D 等其它平台的投影矩阵为当然投影矩阵还会跟参考坐标系有关系,例如 OpenGL 使用的是右手坐标系,但是在NDC中使用的是左手坐标系,因此构造投影矩阵时,需要将 near 和 far 取负。原创 2022-09-16 16:06:05 · 2585 阅读 · 0 评论 -
大型项目中 MSAA 的方案参考
关于锯齿的产生原因以及主流抗锯齿技术 MSAA 网上的资料很多,凡是游戏开发也多多少少都有了解,因此这里就不多赘述,有兴趣可以直接参考以下几篇文章:拿随意一个游戏举例,MSAA N samples 效果对照如下: 前面介绍了锯齿的产生原因以及 MSAA 解决方案,这里主要是介绍 MSAA 每一步是在哪个时机,那一块地方做的,简单描述下性能上的问题,并且主要考虑移动平台的 TBRD 架构一样可以先参阅文章:直入主题:MSAA 先在光栅化阶段生成覆盖信息,然后计算像素颜色,根据覆盖信息和深度信息决定是否来写入子原创 2022-09-07 20:52:05 · 5021 阅读 · 1 评论 -
Renderdoc 帧调试器
RenderDoc 使用手册,注意,本文只适用于分析/Debug自己的应用原创 2022-07-18 11:21:43 · 3435 阅读 · 0 评论 -
Unity USB 连接 Android 真机/模拟器测试
先检查电脑里是否已经安装了 adb 安卓包:打开 Windows PowerShell 命令窗口,输入指令 adb version,如果有出现版本号,就说明没问题否则需要下载 SDK,完毕之后配置下环境变量 准备好 development 安卓包,并通过 SDK 安装:找到你安装包所在位置,PowerShell 命令窗口执行指令 adb install -r "相对路径",如下 然后等待安装成功即可,会出现 Success 提示打开 Unity(最好是空项目)并切换 Android 平台: 然后确保上述设置原创 2022-06-30 16:24:25 · 4179 阅读 · 0 评论 -
Unity3D Soft Mask 软遮罩插件
和常用的 Mask 和 RectMask2D 组件一样,SoftMask 也可以用来对 Image、RawImage 等图形单元进行遮罩,仅显示部分区域,不过相对于传统的遮罩,SoftMask 的区域便于更加的平滑,也可以理解为是渐进式遮罩,往往可以通过它来实现一些边缘羽化等效果...原创 2022-06-15 17:52:18 · 6113 阅读 · 0 评论 -
FairyGUI1:FairyGUI 编辑器
FairyGUI 官网:https://www.fairygui.com/官方手册已经很齐全了,但是内容太多刚看容易迷失方向,所以还是可以记录下重点,可以当作是非常简单的概括式教程一、FairyGUI 编辑器入门FairyGUI 编辑器教程:https://www.fairygui.com/docs/editor/component1.1 组件与基本元件组件就是根节点(Panel),元件就是指具体的一个一个 UI 元素,像图片、文字、按钮这些就是最最基础的元件,为了方便编辑,可以..原创 2021-09-03 18:04:25 · 2232 阅读 · 0 评论 -
有关 Unity UIElements 和 UIToolkit
一、UIElements 简介UnityUIElements:https://blog.unity.com/technology/whats-new-with-uielements-in-2019-1如果写过 Unity 编辑器界面,应该都对 IMGUI 比较熟悉,排版布局类 EditorGUILayout 和 GUILayout 可以说都非常的经典,除此之外,还有 Odin 这类基于 IMGUI 的编辑器拓展的插件,同时也可以帮助开发者进行序列化操作……UIElements 其实也是...原创 2021-08-26 20:38:26 · 4449 阅读 · 0 评论 -
UnityShader33:GPU 实例化
动态合批、静态合批与 GPU 实例化(GPU Instancing)的本质都是通过减少 CPU 对 GPU 绘制请求(Draw Call)的次数,以达到提高性能的目的对相于合批,GPU 实例化(Instancing)是相对独立的一个功能,之前有一篇 OpenGL 的文档可以参考,这篇主要记录 Unity 下如何去实现 GPU 实例化一、再提 GPU 实例化GPU 实例化只提交一个模型网格,然后绘制多次,每次绘制的网格属性都可以不一样:包括缩放、位置、颜色等等,即材质球虽然相同但属性可以各有各..原创 2021-07-19 13:08:52 · 1779 阅读 · 4 评论 -
UnityGI5:实时 GI 与光探代理体
前置:UnityGI2:Lightmaps一、实时 GI字面意思,实时计算间接光照,设置与代码修改如下:1. LightSetting 里面开启 Realtime Lighting,并将对应的主光源 Mode 设置为 Realtime2. 修改 Shader 代码,和之前 Lightmap 采样一样,不过这次采样 dynLightmap,也就是动态光照贴图:MetaPass 的代码可以参考《UnityGI2:Lightmaps》这一章的第三节struct appdata{..原创 2021-07-16 11:21:54 · 780 阅读 · 2 评论 -
UnityGI4:混合光照
前置:UnityGI2:Lightmaps一、混合模式前面设置了光源的模式为 Baked,这意味着光源产生的直接光和间接光都会被记录在 lightmap 中,如果着色器不从 lightmap 中采样,那么静态物体得到的表现就是完全的黑暗。除此之外模式为 Baked 的光源,运行时无法调整且没有贡献如果修改光源模式为 Mixed,那么在烘焙的时候就会只烘焙间接光,并且在运行时该光源被当作实时光产于计算:当然间接光在运行时是不会发生变化的,所以光源在运行的时候也尽量不要过度调整它的位置和属性..原创 2021-07-15 10:18:02 · 712 阅读 · 0 评论 -
UnityGI3:光照探针
前置:UnityGI1:光照烘培一、动态物体间接光漫反射静态物体的光照可以预处理,而动态物体位置会实时变化,这就不好去做提前光照计算,因此一个方案就是在场景中排满一个一个静态的“小球”,预先计算出这些小球的光照。然后游戏运行时,动态物体就可以去每时每刻寻找各方向上离他最近的几个静态“小球”,然后对这些“小球”的光照结果进行插值。用这种方法就可以对动态物体打上间接光漫反射,这个思路和分块打表算法比较相像间接光高光(镜面反射)无法用这种方法计算得到,这个需要去考虑 IBL图片中一个...原创 2021-05-22 16:41:30 · 2063 阅读 · 0 评论 -
UnityGI2:Lightmaps
前置:UnityGI1:光照烘培一、着色器应用 Lightmaps对于烘焙了 lightmaps 的场景,使用了自己的着色器可能得不到正确的结果1.1 关键字VERTEXLIGHT_ON && LIGHTMAP_ON当着色器应用 lightmaps 时,内置关键字LIGHTMAP_ON 会起作用,同时不会再包含顶点光照,也就是对应的VERTEXLIGHT_ON 关键字必然会失效,因此我们可以添加如下的 #pragma 指令:#pragma multi_...原创 2021-05-04 22:14:08 · 1880 阅读 · 0 评论 -
UnityShader32:PBR(一)
一、整装待发1.1:万事俱备UnityShader相关:UnityShader1:渲染流水线~UnityShader24:最简单的屏幕后处理例子 最好还是了解一个图形接口:OpenGL 或者 DirectX 永远别忘记 U3D 的官方手册PBR相关:PBR理论基础1:辐射度与BRDF PBR理论基础2:光照模型与微面元理论 PBR理论基础3:基于图像的光照(上) PBR理论基础3.1:基于图像的光照(下)1.2:只欠东风准备好你的参考资料,以及……新建一个 Sha...原创 2021-04-19 12:19:22 · 662 阅读 · 0 评论 -
UnityGI1:光照烘培
一、全局光照(Global Illumination, GI)系统全局光照(GI)系统这个概念指的是:既要考虑场景中来自光源的直接光照,又要考虑经光在其他物体表面反射后的间接光照光线追踪效果图,可见方块的两侧都映有墙壁的颜色在光线追踪技术成熟之前,全局光照往往无法应用于实时渲染,因为它的渲染成本实在是太高了,现在确实有不少相关的实时算法,但是这些就不在本次文章的范畴之内了若考虑到离线,最简单的情况就是:场景在运行时是完全静态的的,光源也是,这时我们就可以提前计算出光照结果并保存到光照贴图中...原创 2021-04-05 20:02:46 · 5909 阅读 · 0 评论 -
UnityShader31:Gamma
前置:https://blog.csdn.net/Jaihk662/article/details/107879539一、Gamma 理论总结在讲解这篇文章之前,需要先了解什么是 Gamma 空间和线性空间,也就是前置里的内容当然这里也可以进行一个总结:显示器的输出在 Gamma2.2 空间,这对应着 伽马校正即是将颜色转换到 Gamma0.45 空间(sRGB对应的空间),对应,伽马校正和显示器输出平衡之后,正好结果就是Gamma1.0 的线性空间 所有的输入,计算和输出都......原创 2021-04-04 18:10:24 · 1276 阅读 · 0 评论 -
UnityParticle3:3x常用模块
前置:UnityParticle2:5x基础模块一、粒子速度限制模块(Limit Velocity Over Lifetime)此模块可以控制粒子的速度变化,例如实现粒子运动时间越长,其速度越慢Separate Axes:将速度拆分为单独X、Y 和 Z 分量分别考虑 Speed:粒子的速度限制 Space:选择速度限制是适用局部空间还是世界空间,仅当启用了 ①Separate Axes 时,此选项才可用 Dampen:范围 [0, 1],当粒子速度超过速度限制时,粒子速度降低的...原创 2021-04-04 16:04:42 · 401 阅读 · 0 评论 -
UnityParticle2:5x基础模块
前置:UnityParticle1:粒子系统简介Renderere模块可以直接参考 U3D 官网:https://docs.unity3d.com/cn/2018.4/Manual/PartSysRendererModule.html,因为有很多的设置可以暂时不需要了解,所以这里就只记录一些重点原创 2021-04-03 22:51:45 · 582 阅读 · 0 评论 -
UnityParticle1:粒子系统简介
前置:UnityShader一、创建粒子创建方式:GameObject -> Effects ->ParticleSystems,这和创建 3D 物体方法一样,就是分类选择 Effects 就好粒子系统这特殊又复杂的 Inspector 界面初看感觉很吓人,这是因为粒子的属性实在是太多了,因此不得不将它们分为一个一个模块,模块左边复选框上的勾勾就表示启用该模块,一般来讲,最常用的就是 Emission & Shape 和 Renderer当然对于模块的了解可以...原创 2021-04-03 19:20:27 · 3011 阅读 · 2 评论 -
UnityShader30:预编译指令 multi_complie 和 shader_feature
multi_complie 和 shader_feature 编译指令往往用于正式游戏项目的优化一、关键字与Shader变体multi_complie 的用法:#pragmamulti_compile NAMEA, NAMEB, NAMEC, …,参考代码:Shader "Jaihk662/ShaderVariantTest"{ Properties { _MainTex("Texture", 2D) = "white" {} ....原创 2021-03-15 21:02:17 · 968 阅读 · 0 评论 -
RayMarching3:组合与变幻
接上文:RayMarching2:给球加上光照六、联合、交叉与取反1):联合(union)联合的目的很简单:当场景中有多个物体时,这些物体都要显示假定物体 A 和物体 B,它们的 SDF 函数为 和,那么 A ∪ B 就对应//联合float unionSDF(float distA, float distB){ return min(distA, distB);}//物体的SDFfloat sceneSDF(float3 rayPoint){...原创 2021-03-07 19:17:18 · 233 阅读 · 0 评论 -
RayMarching2:给球加上光照
接上文:RayMarching1:用射线的方式画一个圆四、法线与光照如果对偏导或者梯度场有了解,那么对于一个规则的平面想要得到某一点的法线就不是难题考虑到第一节 SDF 函数,我们知道:对于刚好在当前表面上的点 x 满足,对于在表面内部的点满足,对于表面外部的点满足,而法线有一个很重要的性质正是:当且仅当点 x 沿着法线的方向移动,能以最快的速度从负数递增到正数,这个增量可以用来表示,考虑到每个方向上的偏导,也就是说正是我们想要的法线肯定不需要去求导数,就按照周围的采...原创 2021-03-06 20:49:04 · 359 阅读 · 0 评论 -
RayMarching1:用射线的方式画一个球
一、ShaderToy作品如果你对 Shader 有一定的了解,那么你或多或少听说过shaderToy这个网站,这个网站上有很多令人振奋的 shader 效果,而这些效果有可能只用了几行代码来实现。就如同画家绘画,在这里片段着色器就是画笔,屏幕就是画纸:网站中对于任意一个作品,都提供了完整的 GLSL 片段着手器代码,它们是通过在你的浏览器中运行 WebGl 来展现这些效果的。你也可以通过修改代码,修改变量和输入来直接在网页上查看效果的变幻只通过片段着色器来输出你的画面,那么这就基...原创 2021-03-06 12:41:32 · 673 阅读 · 0 评论 -
将ShaderToy中的Shader搬运到Unity
一、ShaderToy作品如果你对 Shader 有一定的了解,那么你或多或少听说过 shaderToy 这个网站,这个网站上有很多令人振奋的 shader 效果,而这些效果有可能只用了几行代码来实现,就如同画家绘画,片段着色器就是我们的画笔,屏幕就是我们的图纸:对于任意一个例子,都提供了完整的 GLSL 片段着手器代码,它们是通过在你的浏览器中运行 WebGl 来展现这些效果的。你也可以通过修改代码,修改变量和输入来直接在网页上查看效果的变换把它搬运到 Unity 上并不难,由于它们...原创 2021-03-06 00:49:02 · 2494 阅读 · 1 评论 -
UnityShader29:模板测试
一、什么是模板测试:OpenGL基础30:模板测试Unity官方文档:https://docs.unity3d.com/Manual/SL-Stencil.html在 Unity 中,最经典的模板测试例子就是 UI Mask:二、Unity 中的模板测试SubShader{ Tags { …… } Pass { Stencil { //可选 Ref referenc...原创 2021-03-05 18:08:06 · 756 阅读 · 1 评论 -
UnityShader28:噪声纹理
一、噪声纹理听名字挺蒙的,其实它的作用就是展现出一个事物“混沌”或“杂乱无章”的效果,就像雾气和雪地,它们绝对不会是均匀单一的,不然给人的感觉就像是屏幕变灰了,以及往地上涂了一层白色油漆一样Shadertoy上关于Perlin噪声的实现噪声纹理本质上是一种“固定”的随机,本章后面使用的噪声纹理如左下:何为“固定”的随机呢?在 C++ 中我们会使用 Random() 函数来解决一类问题,图形领域也一样,只不过有的时只使用简单的随机生成器反而会带来更不自然的效果,右上图就是一张完全随机的噪...原创 2021-03-02 20:50:59 · 1509 阅读 · 0 评论 -
UnityShader例子:边缘检测
一、边缘检测没有什么新的东西,只需了解《UnityShader26:运动模糊》这一章里面的内容就好1):Roberts算子:本质就是计算左上角和右下角的差值,乘上右上角和左下角的插值,作为评估边缘的依据2):边缘检测步骤:了解 Roberts 算子的逻辑后,实现边沿检测就简单了:拿到当前 uv 坐标相邻的4个采样点,分别作为 Roberts 的四个候选点 得到每个点的深度和法线信息 计算两个对角线上候选点的法线和深度差 判断这个差值是否超过设定的阈值,如果超过则判定当...原创 2021-03-02 11:52:31 · 652 阅读 · 0 评论 -
UnityShader27:屏幕雾效
前置:UnityShader26:运动模糊一、Linear01Depth & LinearEyeDepth在前一章中,提到过这两个方法:LinearEyeDepth(d):将获得视角空间下的线性深度值,范围为[Near, Far] Linear01Depth(d):由 LinearEyeDepth(d) / Far 得到,范围为[Near/Far, 1]如果尝试用公式递推的话:根据《OpenGL基础29:深度测试》的内容可以得到:,其中 为远平面,为近平面因此可以反...原创 2021-03-01 00:39:52 · 635 阅读 · 0 评论 -
UnityShader26:运动模糊
一、在 Unity 中使用深度纹理或法线纹理前置:OpenGL基础29:深度测试,关于深度测试的流程以及深度值的算法、空间变换都在这里提到过在 Unity 中,想要在着色器中获得当前摄像机的深度纹理或者法线纹理,只需要设置//让摄像机产出一张深度纹理GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;//让摄像机产出一张深度-法线纹理GetComponent<Camera>()....原创 2021-02-26 11:29:52 · 841 阅读 · 0 评论 -
UnityShader25:在Unity中实现泛光
一、需要提前了解的这一章的例子非常的综合,可以说是知识点广而全,如果能独立在 Unity 中实现一个不错的泛光效果,那么 UnityShader 就算作入门成功!曾经在 OpenGL 的教程中,就已经实现过泛光效果了:OpenGL基础51:泛光 OpenGL基础35:帧缓冲(下)之简单图像处理:里面提到了一些图像处理的算子和卷积明白了泛光的原理后,就是 UnityShader的基础部分:UnityShader24:最简单的屏幕后处理例子:泛光必然也是一种后处理手段 Unit...原创 2021-02-24 14:06:47 · 1472 阅读 · 0 评论 -
UnityShader24:最简单的屏幕后处理例子
一、需要提前了解的其实关于屏幕后处理(Screen Post-processing Effects)相关的知识,前面已经提过了不少:这些是 OpenGL 渲染部分:OpenGL基础35:帧缓冲(下)之简单图像处理:图像处理更多的是思维和算法,和你的平台/语言都无关 OpenGL基础33:帧缓冲(上)之离屏渲染 OpenGL基础34:帧缓冲(中)之附件搞懂了上面这些后,就可以进入 Unity3D 了:UnityShader19:渲染纹理(上)之截屏功能实现:里面有关 Render...原创 2021-02-22 17:45:50 · 503 阅读 · 0 评论 -
UnityShader23:顶点动画
前置:UnityShader22:序列帧动画一、顶点动画如果说序列帧动画(uv 动画)是通过改变 uv 坐标来实现的,那么顶点动画就是通过改变 Mesh 每个顶点的位置,直接让这个物体“扭曲变形”来实现动态效果SCP783-扭曲的人只需要在 Shader 中修改顶点着色器中的 pos 值就可以实现简单的顶点动画,顶点动画的特点:想要实现复杂的动画可能较为困难,如有错误的计算可能会得到非常鬼畜的效果 由于是顶点动画,所以动画的精细程度和物体 Mesh 顶点数目成正比,必然是顶点越细密,...原创 2021-02-21 22:08:03 · 1553 阅读 · 0 评论 -
UnityShader22:序列帧动画
一、序列帧动画序列帧动画的原理是如此的简单,可以说只需要足够多张纸以及足够多的时间,就可以实现最简单的动画:不使用 Animation 工具,只需要使用 Shader 中的内置时间变量,就可以实现最简单的序列帧动画了。就像最早的电影,依次展示一张又一张的图片,只要这些图片是连续的并且切换的足够快,那么当然就可以骗过人的眼睛,得到细腻的动画效果(现在我们的电脑电视本质上依然是这个原理,只不过是以帧的形式表现的)‘序列帧的优点和缺点都很明显:优点:无需任何计算,直接显示图片,逻辑简单,...原创 2021-02-19 21:25:00 · 3912 阅读 · 0 评论