- 博客(1264)
- 资源 (2)
- 收藏
- 关注
原创 蒙特卡洛应用:RTX 光线追踪算法 ReSTIR 原理
ReSTIR 算法全称为 GIalgorithm based on Spatiotemporal Reservoir Resampling,是一种在实时路径追踪渲染算法,用于提高间接光照的采样率,来达到降低路径追踪噪点的目的,它非常适用于计算 GI,目前 UE5.4 的 Lumen 就已实现了基于 ReSTIR 的 Gather……
2024-08-23 16:46:09 652
原创 蒙特卡洛方法
蒙特卡洛在图形渲染领域中有着大量的应用,其中包括但不限于基于物理的渲染(PBR)、基于图像的光照(IBL)、预计算辐照度全局光照(PRT)等等,最新的高效光追算法 ReSTIR 中也需要以蒙特卡洛作为理论基础,UE5 的 Lumen 目前也实现了基于 ReSTIR 的 Gather……
2024-08-21 19:59:48 758
原创 离屏粒子优化
粒子特效一直是一个游戏开发中非常吃性能的点,特点就在于①数量不固定,在极端情况下同时存在的特效数量特别多,不且好合批;②其往往都为半透明物体,混合方式各有不同,同一个 pixel 可能会叠好几层特效。最后带来的结果就是:①大量的 DC,CPU 端优化不下去;②过多的 overdraw 也会带来 GPU 上的压力。而一种比较传统的优化方式就是离屏渲染:即将所有的粒子渲染到一张更低分辨率的 RT 上,并在后处理前把它混合回主渲染目标上,这可有效缓解②带来的性能问题
2024-06-04 16:05:52 884
原创 Unity 如何制作和发布你的 Package
Unity Package 不做过多赘述,像 URP 本质上也是一个 Package,在 Unity 中可以通过菜单栏 → Window → Package manager 来管理你当前的所有 Package,本篇文章主要介绍:如何制作并发布属于你的 Package
2024-04-23 17:40:02 2552
原创 移动平台实时动态多点光源方案:Cluster Light
对于移动平台 Forward 管线,如何支持场景中大量的实时点光源一直以来都是比较棘手的问题,因此,基于空间划分后分块计算光照的思路就应运而生,其可以在保证效果的同时减少 PixelShader 的计算量,大体思路也很简单
2024-03-29 18:46:14 977
原创 shadertoy 游戏《来自星尘》摇杆复刻
如果不要求质感完全一致的话,shadertoy可以最速复刻,还是挺方便的,整体没啥难度,所以就不上教学了吧,左边效果,右边就是代码了,可以自行参考
2024-03-04 18:38:06 565
原创 UnityShader17.2:ESM 阴影技术(下)
接上文:UnityShader17.1:ESM 阴影技术(上),本文主要介绍如何一个大型 URP 项目中应用 ESM 及 VSM
2024-01-18 20:26:56 222
原创 一个完备的手游地形实现方案
使用 Unity 自带的 Terrain,但是等美术资产完成后使用工具转为 Mesh直接使用 Mesh,地形直接由美术通过等 DCC 工具或 UE 工具制作(例如 worldmachine)后导入到 Unity自己实现 Terrain 或魔改 Unity Terrain 源码,走 Heightmap 那一套如果只看实现原理,本质上就是①④(Heightmap)和②③(Mesh)两种方案,据目前对多款手游的截帧分析,绝大多数的手游都还是 Mesh下面简要分析一下各方案。
2023-11-20 23:24:17 1539
原创 Renderer 使用材质分析:materials、sharedMaterials 及 MaterialPropertyBlock
Unity 开发时,在 C# 中通过 Renderer 取材质操作是非常常见的操作,Renderer 有两种常规获取材质的方式:.sharedMaterials 和 .materials,当然,除了 clone material instance 来做表现差异化,Unity 更希望你用 MaterialPropertyBlock,这个才是做材质表现差异化的正确路子
2023-02-17 01:55:57 4432 3
原创 UnityShader35:光晕光效
光晕(halation)是指在曝光拍摄过程中,强光投射到胶片上时,透过胶片乳剂中在片基表面进行反射,从而致使图像发晕的现象
2023-02-13 21:16:55 3445
原创 FT 在图形渲染中的应用:基于 FFT 的海浪模拟
既然任意连续且收敛的函数都可以分解为无数个不同频率、不同幅值的正、余弦信号,且这个性质可以扩展到二维,那么海浪作为“波”的典型,是否也可以将其拆成任意方向不同频率强度的基波的叠加?当然没有问题
2022-12-12 15:20:02 3429 4
原创 UnityShader17.1:ESM 阴影技术(上)
这个方法非常好理解,也很朴素:既然采样一个点计算阴影不够,我就把周围的点都给你采样一遍,然后对结果求个平均,不过这有个很严重的问题:多重采样非常影响性能,单次采样的开销取决于 GPU 是否支持 Pre-Fetch Texture 和这个采样是否是 Simple Texturing(不依赖其他采样结果的采样),但无论单次采样效率如何,多重采样在算法层面效率就低下,其总体复杂度是。
2022-10-13 19:44:38 1184
原创 EarlyZ 与 DepthPrePass
TBR 和 TBDR 架构网上的文章实在太多了,并且不同的硬件,内部具体的实现原理都不太一样(例如 Early-DT 的实现技术对于 PowerVR 是 Hidden Surface Removal (HSR),对于 Adreno 是 Low Resolution Z (LRZ)……)更何况细节,虽说这些都不算机密,但是也不是说你想拿到就拿到,除非是像。
2022-09-29 16:56:10 1714 5
原创 投影矩阵、NDC 空间与 Reversed-Z
也就是说,OpenGL 平台的投影矩阵会和其它平台不一样,而几篇经典的文章()都是推的 OpenGL 的投影矩阵:而对应 D3D 等其它平台的投影矩阵为当然投影矩阵还会跟参考坐标系有关系,例如 OpenGL 使用的是右手坐标系,但是在NDC中使用的是左手坐标系,因此构造投影矩阵时,需要将 near 和 far 取负。
2022-09-16 16:06:05 2431
原创 大型项目中 MSAA 的方案参考
关于锯齿的产生原因以及主流抗锯齿技术 MSAA 网上的资料很多,凡是游戏开发也多多少少都有了解,因此这里就不多赘述,有兴趣可以直接参考以下几篇文章:拿随意一个游戏举例,MSAA N samples 效果对照如下: 前面介绍了锯齿的产生原因以及 MSAA 解决方案,这里主要是介绍 MSAA 每一步是在哪个时机,那一块地方做的,简单描述下性能上的问题,并且主要考虑移动平台的 TBRD 架构一样可以先参阅文章:直入主题:MSAA 先在光栅化阶段生成覆盖信息,然后计算像素颜色,根据覆盖信息和深度信息决定是否来写入子
2022-09-07 20:52:05 4708 1
原创 Unity USB 连接 Android 真机/模拟器测试
先检查电脑里是否已经安装了 adb 安卓包:打开 Windows PowerShell 命令窗口,输入指令 adb version,如果有出现版本号,就说明没问题否则需要下载 SDK,完毕之后配置下环境变量 准备好 development 安卓包,并通过 SDK 安装:找到你安装包所在位置,PowerShell 命令窗口执行指令 adb install -r "相对路径",如下 然后等待安装成功即可,会出现 Success 提示打开 Unity(最好是空项目)并切换 Android 平台: 然后确保上述设置
2022-06-30 16:24:25 4077
原创 Unity3D Soft Mask 软遮罩插件
和常用的 Mask 和 RectMask2D 组件一样,SoftMask 也可以用来对 Image、RawImage 等图形单元进行遮罩,仅显示部分区域,不过相对于传统的遮罩,SoftMask 的区域便于更加的平滑,也可以理解为是渐进式遮罩,往往可以通过它来实现一些边缘羽化等效果...
2022-06-15 17:52:18 5763
原创 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 2125
原创 有关 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 4322
原创 UnityShader33:GPU 实例化
动态合批、静态合批与 GPU 实例化(GPU Instancing)的本质都是通过减少 CPU 对 GPU 绘制请求(Draw Call)的次数,以达到提高性能的目的对相于合批,GPU 实例化(Instancing)是相对独立的一个功能,之前有一篇 OpenGL 的文档可以参考,这篇主要记录 Unity 下如何去实现 GPU 实例化一、再提 GPU 实例化GPU 实例化只提交一个模型网格,然后绘制多次,每次绘制的网格属性都可以不一样:包括缩放、位置、颜色等等,即材质球虽然相同但属性可以各有各..
2021-07-19 13:08:52 1713 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 736 2
原创 UnityGI4:混合光照
前置:UnityGI2:Lightmaps一、混合模式前面设置了光源的模式为 Baked,这意味着光源产生的直接光和间接光都会被记录在 lightmap 中,如果着色器不从 lightmap 中采样,那么静态物体得到的表现就是完全的黑暗。除此之外模式为 Baked 的光源,运行时无法调整且没有贡献如果修改光源模式为 Mixed,那么在烘焙的时候就会只烘焙间接光,并且在运行时该光源被当作实时光产于计算:当然间接光在运行时是不会发生变化的,所以光源在运行的时候也尽量不要过度调整它的位置和属性..
2021-07-15 10:18:02 691
原创 Spine 动画工具
一、文件结构Spine 导出的资源文件如下:.atlas:图集数据文件,内部存储了每张纹理的数据信息 .png:图集资源 .skel / .json 二进制文件:骨骼信息图集可以用纹理解包器解包,需要注意的是 .atlas 同级目录下必须要有对应的 .png 图片,可以打开 .atlas 文件进行确认:而对于 .skel 或是 .json 结尾的骨骼信息,直接点击上图的导入数据就可以了,这里需要注意的是版本需要和制作时的版本对应,否则可能会导入失败:老版本的 Spine 二..
2021-07-05 11:40:09 6488 5
原创 Unity3D 拆包工具 AssetStudio 编译构建
一、关于 AssetStudioAssetStudio 这个工具就不介绍了,如果你看到了这篇文章那么你肯定带有目的~其实无脑的话只要下载一个 release 版本就可以,也就是下载并找到对应的 .exe 文件直接双击运行,看到下面这个界面就算是第一步成功:不过有的时候需求没有那么简单,比如你要解的游戏包加了密,又或者你想要的是美术的一手资源,那么可能就没那么好办了,要不解出来的都是乱码,要不就是图片格式不正确,或者都是碎片资源,要你一个一个手动去加工处理……所以最好的是从 githu..
2021-06-24 19:18:38 46921 4
原创 UnityGI3:光照探针
前置:UnityGI1:光照烘培一、动态物体间接光漫反射静态物体的光照可以预处理,而动态物体位置会实时变化,这就不好去做提前光照计算,因此一个方案就是在场景中排满一个一个静态的“小球”,预先计算出这些小球的光照。然后游戏运行时,动态物体就可以去每时每刻寻找各方向上离他最近的几个静态“小球”,然后对这些“小球”的光照结果进行插值。用这种方法就可以对动态物体打上间接光漫反射,这个思路和分块打表算法比较相像间接光高光(镜面反射)无法用这种方法计算得到,这个需要去考虑 IBL图片中一个...
2021-05-22 16:41:30 2022
原创 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 1802
原创 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 630
原创 PBR理论基础3.1:基于图像的光照(下)
进行随机采样,必然会得出错误的结果,因为你无论怎么采样,都几乎不可能正好命中到那条有 100% 贡献的入射光,这时得出的辐射率结果就会为 0,毕竟这些向量都与积分无关。就算你运气好,其中一次采样刚好命中了那条有 100% 贡献的入射光,你会发现随着采样次数变多,得出来的结果也会越加趋近于 0,也就是收敛到一个错误值。低差异序列很简单,可以理解为完全随机采样和均分采样的一个折中,一个经典的低差异序列是 Hammersley 序列,关于低差异序列和随机,体量不小可以后面开个专篇讲,这里暂时了解下就好了。
2021-04-16 16:31:48 415
原创 PBR理论基础3:基于图像的光照(上)
一、基于图像的光照(Image based lighting, IBL)只要了解了下面这些,就很容易理解基于图像的光照了:直接光与间接光的区别(UnityShader9:光照基础回顾) PBR理论基础2:光照模型与微面元理论 PBR理论基础1:辐射度与BRDF 动态环境映射:UnityShader18.1:立方体贴图(下) OpenGL基础50:HDR 在 PBR 的前两章,光照考虑的都是直接光源,这一章考虑的就是间接光,或者说是环境光一样是和环境立方体贴图有关,基于图像的...
2021-04-11 19:21:17 770
原创 UnityGI1:光照烘培
一、全局光照(Global Illumination, GI)系统全局光照(GI)系统这个概念指的是:既要考虑场景中来自光源的直接光照,又要考虑经光在其他物体表面反射后的间接光照光线追踪效果图,可见方块的两侧都映有墙壁的颜色在光线追踪技术成熟之前,全局光照往往无法应用于实时渲染,因为它的渲染成本实在是太高了,现在确实有不少相关的实时算法,但是这些就不在本次文章的范畴之内了若考虑到离线,最简单的情况就是:场景在运行时是完全静态的的,光源也是,这时我们就可以提前计算出光照结果并保存到光照贴图中...
2021-04-05 20:02:46 5798
原创 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 1221
原创 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 385
原创 UnityParticle2:5x基础模块
前置:UnityParticle1:粒子系统简介Renderere模块可以直接参考 U3D 官网:https://docs.unity3d.com/cn/2018.4/Manual/PartSysRendererModule.html,因为有很多的设置可以暂时不需要了解,所以这里就只记录一些重点
2021-04-03 22:51:45 564
原创 UnityParticle1:粒子系统简介
前置:UnityShader一、创建粒子创建方式:GameObject -> Effects ->ParticleSystems,这和创建 3D 物体方法一样,就是分类选择 Effects 就好粒子系统这特殊又复杂的 Inspector 界面初看感觉很吓人,这是因为粒子的属性实在是太多了,因此不得不将它们分为一个一个模块,模块左边复选框上的勾勾就表示启用该模块,一般来讲,最常用的就是 Emission & Shape 和 Renderer当然对于模块的了解可以...
2021-04-03 19:20:27 2967 2
原创 PBR理论基础2:光照、材质与微面元理论
接上文:PBR理论基础1:辐射度与BRDF五、漫反射项与镜面反射项漫反射项兰伯特(Lambert) BRDF:,为一定值,之所以要除以,是为了保证反射半球积分值为 1,这正好是球表面积的由此可得:给定光源入射方向,表面漫反射出射辐射率就为除此之外,还有一个十分著名的漫反射 BRDF 为 Disney BRDF:,其中 ,为表面颜色,为表面粗糙度高光反射项基于微面元理论,BRDF 高光反射项Cook-Torrance 的形式为:,其中,即光照与视线...
2021-03-27 22:41:31 1045
原创 PBR理论基础1:辐射度与BRDF
前置:UnityShader9:光照基础回顾一、反射等式(reflection equation)定义::观察视角 :入射方向 :表面法向量有基于物理的反射等式:,其为渲染方程的一个实例其中和分别代表出射辐射率和入射辐射率, 为圆域积分...
2021-03-27 18:01:35 2834
OpenGL基础学习完整代码(完整场景带优化).zip
2020-09-28
OpenGL基础学习完整代码.zip
2020-08-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人