Shader 入门精要 12 章总结
后处理BlitUnity 为我们提供的函数是: 1MonoBehaviour.OnRenderImage (RenderTexture src, RenderTexture dest) 在 OnRenderImage 函数中,我们通常是利用 Graphics.Blit 函数来完成对渲染纹理的处理。 123public static void Blit(Texture src, RenderTexture dest);public static void Blit(Texture src, RenderTexture dest, Material mat, int pass = -1);public static void Blit(Texture src, Material mat, int pass = -1); 其中,src 是源纹理,dest 是目标纹理,如果它的值为 null 就会直接将结果显示在屏幕上。 mat 是我们使用的材质,而 src 纹理会被传递材质上 Shader 中名为 _MainText 的纹理属性。参数 pass 的默认值为 -1,表示将依次调用 S...
用 CS 做高斯模糊
先简单说一下 CPU 和 GPU 的架构不同点。 CPU 有很多的 ALU 算数运算单元,GPU 则是更多的流处理器,所以 CPU 适合复杂的运算任务,而 GPU 适合简单的多核简单运算。 一些 GPU 中的概念 streaming processor(sp): 最基本的处理单元。GPU 进行并行计算,也就是很多个 SP 同时做处理。现在 SP 的术语已经有点弱化了,而是直接使用thread来代替。一个 SP 对应一个 thread。 Warp:warp 是SM 调度和执行的基础概念,通常一个 SM 中的 SP(Thread) 会分成几个 Warp (也就是 SP 在 SM 中是进行分组的,物理上进行的分组),一般每一个 Warp 中有32个 Thread.这个 Warp 中的32个 Thread(sp) 是一起工作的,执行相同的指令,如果没有这么多 Thread需要工作,那么这个 Warp 中的一些 Thread(sp) 是不工作的(每一个线程都有自己的寄存器内存和 Local Memory,一个 Warp 中的线程是同时执行的,也就是当进行并行计算时,线程数尽量为32的倍...
后处理
后处理Unity 中常见的后处理方法 : OnRenderImage 是一个摄像机事件,在渲染完成后调用。这个方法的主要作用是接收一个源纹理(源图像)和一个目标纹理,然后对源图像进行处理,最后将处理结果输出到目标纹理。 Camera Stack (相机叠加),如果使用 Universal Render Pipeline (URP) 或 High Definition Render Pipeline (HDRP),可以通过相机叠加来实现后处理效果。在这种情况下,可以将一个摄像机设置为后处理相机,并将其输出叠加到主相机的输出上。 Command Buffers 允许你在渲染管线的不同阶段插入自定义渲染命令。可以在特定的渲染事件(如 CameraEvent.AfterImageEffects)中添加后处理命令。 Image Effects (旧版后处理效果)在 Unity 的早期版本中,Unity 提供了一套 Image Effects(如模糊、景深、色彩校正等)。这些效果通常以组件的形式添加到摄像机上。虽然这不是直接的方法,但这些组件会在内部使用 OnRenderImage ...
烘焙笔记
流程 Unity - Window - Rendering - Lighting。 设置 Lighting Settings Asset 或者生成新的 Lighting Settings Asset。 设置烘焙物体为 Static, 设置光源模式为 Bake 或者 Mixed。 选择最下方的 Generate Lighting。 Lighting Mode 选择 Subtractive 光照探针 创建一个携带有光照探针组件的物体 在光照探针覆盖的区域内放一个平面充当镜子(mirror),创建一个标准着色器给 mirror,然后调整着色器的参数 MetalIC 和 Smoothness 为 1. 在镜子的前面摆放一些简单的 Cube 查看效果。 反射探针前向渲染中的光处理 一定数目的光源会按照逐像素的方式进行处理, 场景中最多有 4 个光源按照逐顶点的方式处理 一些烘焙相关的操作点 烘焙完成后觉得效果不好,然后发现调整场景中的物体没有实时反应,这个是因为此时静态物体已经带有了光照信息,打开 Lighting 设置,选择 Baked Lightmaps,然后删除 Lighti...
Unity Shader 常用函数
Unity Shader常用函数列表Unity内置矩阵(float4x4)UNITY_MATRIX_MVP 当前模型 视图 投影 矩阵 UNITY_MATRIX_MV 当前模型 视图 矩阵 UNITY_MATRIX_V 当前视图矩阵。 UNITY_MATRIX_P 目前的投影矩阵 UNITY_MATRIX_VP 当前视图 投影 矩阵 UNITY_MATRIX_T_MV 模型视图转 矩阵 UNITY_MATRIX_IT_MV 模型视图逆 转 矩阵 UNITY_MATRIX_TEXTURE0 UNITY_MATRIX_TEXTURE3 纹理变换矩阵 CG标准函数库Cg 标准函数库主要分为五个部分:数学函数(Mathematical Functions)几何函数(Geometric Functions)纹理映射函数(Texture Map Functions)偏导数函数(Derivative Functions)调试函数(...
坐标变换
坐标变换坐标变换是图形学最基础的东西,这个搞不明白一切都是瞎搞,不自己老老实实走一遍看再多的代码,做再多的效果都是纸上谈兵。 从 vertex 到 frag在顶点函数里面拿到的坐标就是局部坐标,如下,通过 “UnityObjectToWorld” 这个方法可以拿到世界坐标。 从模型到世界逻辑意义,将所有模型的坐标都放在一个统一的坐标系中。 12345678910v2f vert (appdata v){ v2f o; ... float4 worldPosition = UnityObjectToWorld(v.vertex); //上面的方法等效下面的方法 //float4 worldPosition = mul(unity_ObjectToWorld, v.vertex); ... return o;} 从世界到视图逻辑意义:让相机作为坐标的原点,并且固定相机的朝向,使得相机的 Y 轴朝上,看相 -Z 轴,X轴对准 X轴。 1float4 viewPosition = mul(unity_MatrixV, wor...
Shader Feature 笔记
Feature函数值收敛saturate(x) 如果 x 小于0,返回 0;如果 x大于 1,返回1;否则,返回x 参考链接 https://zhuanlan.zhihu.com/p/389971233 获取模型中心点世界坐标unity的世界变化矩阵最后一列是存的Transform里的Position,所以我们可以在shader里提取这部分数据做一些计算,下面是unity支持的几种写法: 12345float3 center = float3(unity_ObjectToWorld[0].w, unity_ObjectToWorld[1].w, unity_ObjectToWorld[2].w);float3 center = float3(unity_ObjectToWorld._m03, unity_ObjectToWorld._m13, unity_ObjectToWorld._m23);float3 center = float3(ity_ObjectToWorld , float(0,0,0,1)).xyz;float3 center = ObjectToWorld....
平面投影
平面投影 平面投影是计算出来的,不需要实时光,消耗很小,王者荣耀等许多游戏都是用的这种,已经是比较成熟好用的东西了,拿来记录学习一下。 Shader 代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155Shader "Custom/PlanarShadow_Circle"{ Propert...
红点系统
红点系统 之前我接触的系统都是耦合性比较高的,一旦 UI 表现修改,或者层级有修改,代码改动非常大,于是老大让我参考前缀树和链表重写一个红点系统。 新写的红点系统比较抽象,第一次看可能都不是很好理解,在看的时候一定要明确将数据层和逻辑层分开抽象,这两个层级有关联,但是不完全相同。所以抽象完之后有一个好处就是,我用一个字典来代替了层级逻辑,这样即使 UI 怎么改我都只用改一下逻辑字典和 UI 表现上的字典,代码不用变化。 结构 如图,一个简单的红点结构如下,每一个 Item 都有一个对应的层级和 ID,可以根据层级和 ID 确定任意一个子节点。 这里值得注意的是,这个层级是逻辑上的层级,是数据层面的,表现层面用的时候不要这么死板,比如主页里面嵌套了一个 UI,这里的 UI 和主页都显示同一个逻辑红点,那么在上面的序列化填写的时候,这两个其实是一模一样的,不需要写两个数据。 逻辑 红点的刷新逻辑是,如果我更新了 【“4”,0】对应的子节点时,需要沿着当前路径更新他之前的每一个父节点 【“3”,1】、【“2”,1】【“1”,0】【“0”,0】。 这里的逻辑有点类似于链表,我用一个类...
Shader 数学基础
坐标系笛卡尔坐标系(法语:système de coordonnées cartésiennes,英语:Cartesian coordinate system,也称直角坐标系)在数学中是一种正交坐标系,由法国数学家勒内·笛卡尔引入而得名。二维的直角坐标系是由两条相互垂直、相交于原点的数线构成的。在平面内,任何一点的坐标是根据数轴上对应的点的坐标设定的。在平面内,任何一点与坐标的对应关系,类似于数轴上点与坐标的对应关系。 采用笛卡尔坐标系,几何形状可以用代数公式明确地表达出来。几何形状的每一个点的直角坐标必须遵守这个代数公式。 直线: ${\displaystyle ax+by+c=0}$ 斜截式 : ${\displaystyle y=mx+k}$ 圆 : ${\displaystyle (x-a)^{2}+(y-b)^{2}=r^{2}}$ 众所周知,OpenGL使用的是右手坐标系,而Direct3D使用的是左手坐标系。 Unity 使用的是左手坐标系。 点和向量点和向量点是三维空间中的某个坐标,是绝对的,它的值是参照原点的,而向量...