US3S11——深度和法线纹理
US3S11——深度和法线纹理 目前的屏幕后处理存在的问题 屏幕后期处理效果的基本原理就是当游戏画面渲染完毕后,通过获取到该画面的信息进行额外的效果处理 之前学习的边缘检测、高斯模糊、Bloom、运动模糊等屏幕后处理效果,都是基于获取当前屏幕图像中的像素信息进行后期处理的 如果仅仅根据像素信息来进行一些效果处理,存在以下问题: 效果欠佳:比如实现边缘检测时,边缘检测信息受物体纹理和光照等因素影响,无法更准确的检测边缘,会得到一些我们不需要的边缘点 无法实现:比如我们想要实现一些景深效果(虚化背景)...
US3S10L9——运动模糊
US3S10L9——运动模糊 运动模糊效果 运动模糊效果,是一种用于模拟真实世界中快速移动物体产生的模糊现象的图像处理技术 当一个物体以较高速度移动时,由于人眼或摄像机的曝光时间过长,该物体会在图像中留下模糊的运动轨迹。 这种效果游戏、动画、电影中被广泛应用,以增加视觉真实性和动感。 运动模糊效果的基本原理 想要在屏幕后期处理中实现运动模糊,一般有两种常用方式: 累积缓存:物体快速移动时存储多帧图像信息,取它们之间的加权平均值作为最后的运动模糊图像 优点:质量高、效果好 缺点:计算量大,存储开销大 速度缓存:物体快速移动时存储多帧运动速度信息,利用速度来决定模糊的方向和大小 优点:性能较累积缓存好 缺点:效果较差,可能产生重影和伪影 这里我们使用基于累积缓存来实现动态模糊效果。但是我们不需要像累积缓存中那样存储多张场景信息, 而是需要保存之前的渲染结果,不断把当前的渲染图像叠加到之前的渲染图像中,从而产生一种运动轨迹的视觉效果。 相当于是基于累积缓存的优化,性能会更好,但是模糊效果可能略有欠缺,但是效果也是可以接受的。 它的基本原理是:用一个...
US3S10L8——Bloom效果
US3S10L8——Bloom效果 本章代码关键字 1UNITY_UV_STARTS_AT_TOP // 判断纹理是否会进行y轴翻转 Bloom 效果 Bloom 效果(中文也可以叫做高光溢出效果),是一种使画面中亮度较高的区域产生一种光晕或发光效果的图像处理技术 Bloom 效果 的主要目的是 模拟现实世界中强光源在相机镜头或人眼中造成的散射和反射现象 使得画面中较亮的区域“扩散”到周围的区域,造成一种朦胧的效果 Bloom 效果的基本原理 三步骤概括 Unity Shader 中实现 Bloom 效果的基本原理: 提取:提取原图像中的亮度区域存储到一张新纹理中 模糊:将提取出来的纹理进行模糊处理(一般采用高斯模糊) 合成:将模糊处理后的亮度纹理和源纹理进行颜色叠加 关键知识点:多个 Pass 的运用,如何提取,如何模糊,如何合成 多个Pass的运用 通过高斯模糊效果的学习,我们知道可以在屏幕后处理时,单独调用某个 Pass 对渲染纹理进行处理,只需要利用 Unity...
US3S10L7——高斯模糊
US3S10L7——高斯模糊 本章代码关键字 12CGINCLUDE // CG共享代码关键字ENDCG // CG共享代码结束关键字 12RenderTexture.GetTemporary() // 申请中间纹理缓存RenderTexture.ReleaseTemporary() // 释放中间纹理缓存 卷积回顾 卷积就是利用一个 N*N 的卷积核(滤波核),和图像中目标像素及其周围像素信息进行对位相乘后相加的结果 之前学习的边缘检测,只是卷积在图形学中的其中一种应用而已,它还可以用来完成其他效果的制作 注意: 卷积核一般为 奇数*奇数 大小,主要原因是需要进行中心对齐以及保持对称性 卷积核在图像边缘计算时,会缺少周围像素,常见处理方法有零填充、镜像填充、循环填充等 在 UV...
US3S10L6——边缘检测
US3S10L6——边缘检测 边缘检测效果 边缘检测效果,是一种用于突出图像中的边缘,使物体的轮廓更加明显的图像处理技术 边缘检测的主要目的是找到图像中亮度变化显著的区域,这些区域通常对应于物体的边界 边缘检测相当于利用 Shader 代码自动给屏幕图像进行描边处理,下图就是边缘检测的例子: 边缘检测效果的基本原理 一句话概括 Unity Shader 中实现边缘检测效果的基本原理: 计算每个像素的灰度值,用灰度值结合卷积核进行卷积运算,得到该像素的梯度值, 梯度值越大越靠近边界,越趋近于描边颜色 梯度值越小表明不是边界位置,越趋近于原始颜色 关键知识点:灰度值、卷积、卷积核、梯度值 灰度值 灰度值指只含有亮度信息而没有色相和饱和度的颜色,即图像中的每个像素只有从黑到白的不同灰度级别。 在最简单的形式中,灰度图像的每个像素可以由一个值表示,这个值通常是从 0(黑色)到 255(白色)之间的整数。 利用图像颜色 RGB 计算一个平均值,即可得到一个灰度值,因为人眼对不同颜色敏感度不同, 因此会对三个颜色分别乘以不同的权数,用加权平均法来计算灰度值,下面是基于...
US3S10L5——亮度、饱和度、对比度
US3S10L5——亮度、饱和度、对比度 改变屏幕的亮度、饱和度、对比度 亮度、饱和度和对比度的计算规则是在视觉科学、色彩理论和图像处理技术的基础上逐步发展起来的, 这些规则不是由某个人发明的,而是通过多年的研究和实践得出的, 这些计算方法被广泛应用于各种图像处理工具和计算机图形学中,用于实现图像的调整和优化 颜色亮度的基本原理 想要改变图像颜色的亮度,只需要对图像的每个像素进行加法(减法-加负数)或乘法(除法-乘小数)运算即可实现 增加亮度就是增加像素的 RGB 值 减小亮度则是减少像素的 RGB 值 也就是说我们只需要在 Shader 当中加入一个控制亮度的 float 类型的变量 然后用颜色的 RGB 乘以该变量或者加上该变量即可,一般我们会采用乘法的形式 即:最终颜色 = 原始颜色 * 亮度变量 亮度变量 > 1 时,图像变亮 亮度变量 < 1 时,图像变暗 亮度变量 = 1...
US3S10L4——屏幕后处理基类
US3S10L4——屏幕后处理基类 本章代码关键字 1234shader.isSupported // 判断此Shader在目标平台和硬件上是否能正确运行[ExecuteInEditMode] // 使脚本在编辑器模式下也能执行的特性,此特性不考虑预制体模式下的情况[RequireComponent()] // 指定某个脚本所依赖的组件,它确保当你将脚本附加到游戏对象时,所需的组件也会自动添加到该游戏对象中HideFlags // 用于控制对象的销毁、保存和在Inspector中的可见性的枚举 知识点补充 Shader.isSupported 如何判断 Shader 在目标平台和硬件上是否能正确运行 我们可以通过获取 Shader 对象中的 isSupported 属性判断 如果返回 false,说明当前平台不支持此 Shader 正确 如果返回 true,说明当前平台能够正确运行此 Shader [ExecuteInEditMode]...
US3S10L3——屏幕后处理基本实现原理
US3S10L3——屏幕后处理基本实现原理 Unity中屏幕后期处理效果的基本实现原理 从上文可以知道,想要完成屏幕后期处理效果,最关键的问题在于: 如何获取游戏画面渲染完毕后的画面信息 如何为获取到的画面信息添加自定义效果 只要搞清楚这两点,自然就明白了基本实现原理: 如何获取游戏画面渲染完毕后的画面信息 之前在学习 渲染目标纹理 时学习过,在 Unity 中获取渲染纹理的常用方法有三种: RenderTexture(渲染纹理)、GrabPass(Shader 内使用)、OnRenderImage 我们在处理屏幕后期处理效果时会使用 OnRenderImage 函数来获取 游戏画面渲染完毕后的画面信息 如何为获取到的画面信息添加自定义效果 主要思路是将获取到的游戏画面作为 自定义Shader 的主纹理 通过 自定义Shader 利用捕获的画面来实现自定义效果 捕获画面的关键 —— OnRenderImage函数 OnRenderImage() 是在继承了 MonoBehaviour...
US3S10L2——C#代码修改材质参数
US3S10L2——C#代码修改材质参数 本章代码关键字 12345678910111213141516Renderer // 渲染器基类,MeshRenderer和SkinMeshRenderer都派生于此renderer.material // 获取渲染器上使用的第一个实例化材质,也就是材质的副本,修改此属性得到的材质只会影响到一个对象renderer.sharedMaterial // 获取渲染器上使用的第一个共享材质,修改此属性得到的材质影响到所有使用材质的对象renderer.materials // 获取渲染器上使用的所有实例化材质renderer.sharedMaterials // 获取渲染器上使用的所有共享材质Material // 材质类material.color // 修改材质的主颜色material.mainTexture ...