1.AI与PDE(七):AFNO模型的核源函数源代码解析
2.matlab里smooth函数是怎么实现的?
3.第7章:OFDM 信道估计与均衡(1)
4.单目3D目标检测
5.Panoptic-FlashOcc:目前速度和精度最优的全景占用预测网络
6.mobile aloha代码解析和复现
AI与PDE(七):AFNO模型的源代码解析
本文旨在解析AFNO模型的源代码,帮助读者理解模型细节与主干结构。码高首先,斯核AFNO模型的代码主干框架在afnonet.py文件中定义,通过类AFNONet实现。核源函数模型的码高以太坊 源码 js核心功能封装在多个类与函数中,依据代码注释逐步解析。斯核
在代码中,代码forward_features函数负责模型的核源函数核心逻辑,包括patch切割与mixing过程。码高这些操作由PatchEmbed类实现。斯核位置编码self.pos_embed通过高斯初始化得到,代码增加模型的核源函数表示能力。
关键模块AFNO2d位于代码中,码高它基于FNO的斯核原理,负责处理输入数据。AFNO2d模块在forward_features函数中通过循环调用,实现数据的转换与混合。
经过数个L layer处理后,模型进入类似解码器的结构,用于将中间结果映射为目标结果。这一过程通过self.head(x)实现,以解决特定分类问题。
本文通过梳理代码流程与结构图,直观展示了AFNO模型的工作原理。读者可参考AFNO的GitHub源代码与论文,深入理解细节。后续文章将继续探讨基于AFNO模型框架的其他应用,如FourCastNet。
matlab里smooth函数是怎么实现的?
在 MATLAB 的 smooth 函数中,实现平滑处理的方法依赖于其内部文档所提到的算法。要深入理解这些算法,只需在 Google 上搜索相关算法的介绍,甚至直接找到对应的 C 程序代码进行学习。这为用户提供了一个直观的途径,能更好地掌握 smooth 函数背后的具体实现。
值得注意的是,smooth 函数的源代码是可访问的,且在实现过程中并未引入复杂或难以阅读的内部函数,这使得用户可以与文档中介绍的算法相对照,从而更清晰地理解其工作原理。
MATLAB 的 smooth 函数通常采用以下几种平滑方法:移动平均、低通滤波器、三次样条插值、高斯平滑等。这些方法各有优劣,适用于不同类型的信号处理场景。移动平均法通过计算相邻数据点的平均值来减少数据波动;低通滤波器则通过抑制高频噪声,保留信号的主要趋势;三次样条插值在数据点之间创建平滑曲线,以提供连续的导数;高斯平滑则使用高斯核函数对数据进行加权平均,以平滑数据。
要使用 smooth 函数,用户需提供输入数据和选择合适的平滑方法。函数会根据所选方法对数据进行处理,以达到平滑效果。在选择方法时,应考虑数据的特性、平滑目的以及对数据细节的保留程度。例如,对于快速变化且可能包含噪声的render源码大全数据,低通滤波器可能更适合;而对于需要保持数据连续性的应用,三次样条插值则是一个不错的选择。
通过对照文档和源代码,用户可以更好地理解 smooth 函数的内部逻辑和参数设置,从而更有效地应用此函数于实际信号处理任务中。此外,熟悉不同平滑方法的原理和适用场景,将有助于用户在 MATLAB 中进行更加精确和有效的数据平滑操作。
第7章:OFDM 信道估计与均衡(1)
本文旨在深入探讨OFDM信道估计与均衡的相关知识。通过一系列书籍推荐与代码实践,旨在让读者对OFDM的理论与实际应用有更深入的理解。下面,我们将对OFDM相关书籍、经过高斯白噪声信道的误码率分析以及总结进行详细阐述。
在OFDM书籍选择上,推荐《MIMO-OFDM无线通信技术及MATLAB实现》与《Simulation and Software Radio for Mobile Communications》。前者提供了丰富的MATLAB源代码,便于读者实践和理解,尽管可能存在代码版本不适应新MATLAB版本的情况。后者则侧重于仿真技术,包括PSK调制、OFDM等内容,同样附有MATLAB源代码,适合本科生学习。根据OFDM理论难度,推荐《MIMO-OFDM无线通信技术及MATLAB实现》深入学习信道估计与信道均衡。
关于OFDM经过高斯白噪声信道的误码率分析,我们从理论出发,结合实践进行深入探讨。首先推荐知乎上@子木的《OFDM完整仿真过程及解释(MATLAB)》作为理论基础。针对此,本系列文章侧重于瑞利信道下的误码率仿真与补偿技术的实践,通过代码实现,使读者能够亲身体验并理解OFDM在实际应用中的性能。
在实现过程中,首先需要明确一些基础假设:调制采用QPSK,可自行编写或利用MATLAB的内置函数;无信道编码过程;不涉及上载波与下载波过程、载波同步、位定时同步等。对于仿真结果的验证与调试,我们提出几点建议:利用理论知识分析误码率曲线,结合波形图判断信号特性,如时域波形、频域波形等。确保每个模块的正确性,从特殊到一般进行验证,并在加入到大程序前逐一测试。利用MATLAB的“help”功能辅助理解函数用法,确保代码实现的准确性。
在OFDM信号经过瑞利信道的仿真中,重点关注误码率情况与信道均衡的实现。通过比较仿真曲线与理论曲线,我们发现实验曲线相比于理论曲线向右平移,这一现象与保护间隔(CP)的长度有关。保护间隔的引入是为了避免符号间干扰(ISI),其长度需大于最大多径时延扩展。理论解释CP长度与ISI之间的关系,以及CP在时间同步、频率估计等方面的深挖redis源码应用。
总结而言,本文旨在通过书籍推荐、误码率分析与实践案例,为读者提供深入理解OFDM信道估计与均衡的途径。通过本系列文章的学习,读者将能够更全面地掌握OFDM技术的核心概念与实际应用方法。
单目3D目标检测
单目3D目标检测是计算机视觉领域中的一项重要任务,旨在识别出目标的类别以及在相机坐标系下的精确位置。这个过程通常分为三个关键部分:确定目标类别、获取边界框信息(高度、宽度、长度、位置坐标、朝向角度)和回归目标的八个关键点坐标。本文将详细阐述这一技术的实现流程和关键组件。
首先,单目3D目标检测系统通常包含一个主干网络(如DLA-),该网络用于提取特征并生成目标中心点的热力图,这是检测的基础。热力图的生成基于高斯核函数,其半径大小根据目标的实际宽度和高度确定,确保即使存在中心点微小偏移,也能正确检测目标。然后,通过约束处理,将热力图结果转换为概率值,范围在0到1之间。
接下来,进行3D边界框回归,这一过程涉及到深度偏移、中心点偏移、尺寸偏移、方向角等参数的预测。预测结果经过变换调整,例如将深度偏移范围调整至(-0.5, 0.5),方向角归一化至(sin, cos)形式,以适应后续处理。这些预测值经过解码,计算目标在相机坐标系下的实际位置,其中关键一步是利用相机成像原理计算目标的全局方位角。
在训练阶段,采用GaussianFocalLoss和L1Loss作为损失函数。GaussianFocalLoss在正样本附近引入额外的约束,以减少对中心点附近的负样本损失的影响。L1Loss用于衡量预测值与实际值之间的差异,确保回归结果的精确性。
为了进一步提升检测性能,引入了fcos3D模型,该模型通过共享权重的头部网络预测目标中心点位置(centerness)和3D边界框参数。其中,centerness分支用于衡量预测点与真实目标中心点的相对距离,通过计算目标中心点与预测框中心点之间的距离,使用特定公式进行计算。此外,fcos3D模型还通过FocalLoss进行损失计算,并采用SmoothL1loss、CrossEntropyLoss等损失函数,以平衡不同尺度的目标检测和分类任务。
除了上述模型外,netty线程源码还存在如3D BBox Estimation Using Deep Learning and Geometry的论文,该方法利用目标的2D边界框和相机几何关系来推测目标的中心点位置,同时设计网络回归目标的三维尺寸和偏航角。通过将°角度分解为方向分类和角度回归,得到目标的全局偏航角,并结合先验尺寸信息,最终通过相机投影反向计算目标的3D中心点。
在实现过程中,可变形卷积(DCN)被广泛应用于这些模型中。DCN相比传统卷积,引入了偏移量(offset)概念,通过学习这些偏移量,可变形卷积能够更加精准地定位目标,减少背景干扰,提升检测效果。理解DCN的原理和应用,需要参考相关源码和教程,如Deformable ConvNets v2 Pytorch版源码讲解。
总结而言,单目3D目标检测技术通过复杂的特征提取、多参数回归和损失函数优化,实现了对目标的精确识别和定位。其中,可变形卷积的引入显著提升了检测的准确性,使得这一技术在自动驾驶、机器人视觉等领域展现出巨大的应用潜力。
Panoptic-FlashOcc:目前速度和精度最优的全景占用预测网络
宣传一下小伙伴最新的工作Panoptic-FlashOcc,这是一种高效且易于部署的全景占用预测框架(基于之前工作 FlashOcc),在Occ3DnuScenes上不仅取得了最快的推理速度,也取得了最好的精度。
全景占用(Panoptic occupancy)提出了一个新的挑战,它旨在将实例占用(instance occupancy)和语义占用(semantic occupancy)整合到统一的框架中。然而,全景占用仍然缺乏高效的解决方案。在本文中,我们提出了Panoptic-FlashOcc,这是一个简单、稳健、实时的2D图像特征框架。基于FlashOcc的轻量级设计,我们的方法在单个网络中同时学习语义占用和类别感知的实例聚类,联合实现了全景占用。这种方法有效地解决了三维voxel-level中高内存和计算量大的缺陷。Panoptic-FlashOcc以其简单高效的设计,便于部署,展示了在全景占用预测方面的显著成就。在Occ3D-nuScenes基准测试中,它取得了.5的RayIoU和.1的mIoU,用于语义占用,运行速度高达.9 FPS。此外,它在全景占用方面获得了.0的RayPQ,伴随着.2 FPS的快速推理速度。这些结果在速度和准确性方面都超过了现有方法的性能。源代码和训练模型可以在以下github仓库找到: / Yzichen/FlashOCC。
在本节中,我们概述了如何利用所提出的实例中心将全景属性集成到语义占用任务中。我们首先在第3.1节提供架构的概述。然后,php原创源码我们在第3.2节深入到占用头,它预测每个体素的分割标签。随后,在第3.3节中,我们详细阐述了中心度头,它被用来生成类别感知的实例中心。最后,在第3.4节中,我们描述了全景占用处理,它作为一个高效的后处理模块,用于生成全景占用。
如图2所示,Panoptic-FlashOcc由四个主要部分组成:BEV生成、语义占用预测、中心度头和全景占用处理。BEV生成模块将环视图像转换为BEV特征[公式],其中H、W和C分别表示特征的高度、宽度和通道维度。这个转换是通过使用图像编码器、视图转换和BEV编码器来实现的,这些可以直接从[, , , ]中采纳。为了确保在边缘芯片上高效部署,我们坚持使用FlashOCC[]的配置,其中ResNet[8]被用作图像编码器,LSS[9, ]作为视图转换器,ResNet和FPN被用作BEV编码器。
语义占用预测模块以上述扁平化的BEV特征[公式]作为输入,并生成语义占用结果[公式],其中[公式]表示垂直于BEV平面的体素数量。同时,中心度头分别生成类别感知的热图[公式]和实例中心的回归张量[公式],其中[公式] 代表"thing"类别的语义数量。
最后,语义占用结果[公式]和上述实例中心信息通过全景占用处理,生成全景预测[公式]。需要注意的是,全景占用处理作为后处理步骤,不涉及任何梯度反向传播。
为确保方案轻量且易于部署,语义占用预测模块的架构直接继承自FlashOCC[]。它由一个占用头和一个channel-to-height的模块组成,能够预测"thing"和"stuff"类别的语义标签。占用头是一个子模块,包含三个2D卷积层。根据[, ]中提出的损失设置,损失函数通过引入距离感知(distance-aware)的focal loss[公式] [],改进了FlashOcc中使用的pixel-wise交叉熵损失。此外,为了增强3D语义场景完成(Semantic Scene Completion, SSC)处理遮挡区域的能力,采用了语义亲和损失 [公式] [2]和几何亲和损失 [公式]。此外,lovasz-softmax损失[公式] []也被引入到训练框架中。
我们框架中提出的centerness head,有两个目的:如图2底部中心块所示,中心度头包括中心回归头和中心热图头。两个模块都包含三个卷积层,搭配3×3的核心。Center Heatmap Head. 中心点表示对于"thing"和"stuff"的重要性已在包括目标检测[9, , , ]、实例分割[6]和全景分割[3, ]等多项研究中得到广泛证明。在训练过程中,gt实例中心度值使用2D高斯分布进行编码,其标准差等于标注实例的对角线大小。focal loss被用来最小化预测的class-aware热力图[公式]与对应gt之间的差异。
全景占用处理模块充当实例标签的分配模块,设计得既简单又有效。它完全依赖于矩阵运算和逻辑运算,不包含任何可训练参数。这种设计使得全景占用处理的实现直接而高效。
给定class-aware热力图[公式],我们通过局部最大置信度提取候选实例中心索引。具体是将maxpool应用于[公式],kernel大小为3×3,找到那些被maxpool筛选出的索引。这个过程类似于目标检测中的非极大值抑制(NMS)。随后,保留置信度最高的前个索引,并使用顺序得分阈值[公式](设置为0.3)来过滤置信度低的索引。最后,我们获得了[公式]个实例中心索引提案[公式],其中[公式]、[公式]和[公式]分别代表沿[公式]、[公式]和[公式]轴的索引。[公式]的值对应于相应实例的语义标签。使用中心回归张量[公式],我们可以进一步获得与精确的3D位置和语义标签配对的实例中心提案,表示为[公式]:
[公式]
这里的[公式] 和 [公式] 分别代表沿 [公式] 轴和 [公式] 轴的体素大小,[公式] 是沿 [公式] 轴的感知范围。
我们使用一个简单的最近邻分配模块来确定[公式]中每个体素的实例ID。Algorithm 1给出了相关处理的伪代码。给定语义占用[公式]和实例中心[公式]作为输入,最近邻分配模块输出全景占用[公式]。首先,我们将实例ID号[公式]初始化为0。对于语义标签中的每个类别[公式](共有[公式]个语义类别),我们首先收集在[公式]中值为[公式]的索引集[公式]。然后,我们根据[公式]是否属于“stuff”对象或“thing”对象,采取不同的处理方式。
这些结果在速度和准确性方面都超过了现有方法的性能。在具有挑战性的Occ3DnuScenes测试中,Panoptic-FlashOcc不仅取得了最快的推理速度,也取得了最好的精度。这使得它成为目前速度和精度最优的全景占用预测网络。
总结:本文介绍了Panoptic-FlashOcc,这是一种高效且易于部署的全景占用预测框架。它基于已建立的FlashOcc,通过整合centerness head和全景占用处理,将语义占用增强为全景占用。Panoptic-FlashOcc在具有挑战性的Occ3DnuScenes测试中不仅取得了最快的推理速度,也取得了最好的精度。
mobile aloha代码解析和复现
本文基于 mobile-aloha的开源代码复现工作,分为四大部分:下载与修改源代码、安装依赖、准备数据集、训练与评估。
首先,下载仓库源代码,链接为:github.com/MarkFzp/act-plus-plus。注意,源代码中存在一些小错误或说明不清,已做修改。可直接pull本仓库代码。
为简化步骤,使用requirements.txt文件通过pip安装依赖。部分代码错误已解决,可直接pull代码。
运行代码前,确认默认代码使用wandb进行日志记录和可视化。若希望自行可视化,修改wandb用户名和key,查看相关教程。默认代码使用wandb,自定义设置账号。
数据集分为实际采集和仿真两种。实际数据需下载解压,确保路径正确。仿真数据集通过特定脚本可视化,实际数据集则使用不同脚本处理。
训练过程包括数据准备、训练和评估。下载数据、执行训练脚本并选择适当任务。使用预设参数训练策略,记录训练过程。评估策略时,考虑策略表现和潜在改进。
算法实现细节解析中,mobile-aloha核心为ACT算法,模仿学习过程通过行为克隆、GAN、VAE等模型实现。VAE架构包含编码器、隐变量、解码器。编码器输出高斯分布,解码器预测动作序列。推理阶段隐变量设置为标准高斯分布。
文章结束处提及后续研究方向,包括泛化性、任务适应性和结合大模型等。对代码理解不清晰或有遗漏之处,欢迎指出。
å¦ä¹ JAVAç书ç±
Javaè¯è¨åºç¡
è°å°Javaè¯è¨åºç¡å¦ä¹ ç书ç±ï¼å¤§å®¶è¯å®ä¼æ¨èBruce EckelçãThinkinginJavaããå®æ¯ä¸æ¬åçç¸å½æ·±å»çææ¯ä¹¦ç±ï¼Javaè¯è¨åºç¡é¨ååºæ¬æ²¡æå ¶å®ä»»ä½ä¸æ¬ä¹¦å¯ä»¥è¶ è¶å®ã该书çä½è BruceEckelå¨ç½ç»ä¸è¢«ç§°ä¸ºå¤©æçææºè ï¼ä½è çãThinking in C++ãå¨å¹´æ¾è·SoftwareDevelopmentJoltAwardæ佳书ç±å¤§å¥ï¼ãThinking inJavaã被è¯ä¸ºå¹´JavaWorldâæç±è¯»è 欢è¿å¾ä¹¦âï¼å¹¶ä¸èµ¢å¾äºç¼è¾é¦éå¾ä¹¦å¥ãä½è ä»å¹´è³ä»ï¼å·²ç»å表äºè¶ è¿ç¯è®¡ç®æºææ¯æç« ï¼åºçäº6æ¬ä¹¦ï¼å ¶ä¸4æ¬æ¯å ³äºC++çï¼ï¼å¹¶ä¸å¨å ¨ä¸çåäºæ°ç¾æ¬¡æ¼è®²ãä»æ¯ãThinking in JavaãããThinking inC++ãããC++ Inside& OutããUsing C++ãåãThinking inPatternsãçä½è ï¼åæ¶è¿æ¯ãBlackBeltC++ãæéçç¼è¾ãä»ç书被读è 称为âæ好çJavaåè书â¦â¦ç»å¯¹è®©äººéæâï¼âè´ä¹°Javaåè书æææºçéæ©âï¼âæè§è¿çææ£çç¼ç¨æåâãä½è çéå¡æåï¼æå ¶è·¨è¶è¯è¨çè½åï¼ä½¿ä½è 被é为Javaåå±å¹´é´ä¸Javaå ³ç³»æå¯åç个人ç©ä¹ä¸ã
ãThinking in Javaã讲述äºJavaè¯è¨çæ¹æ¹é¢é¢ï¼å¾å¤Javaè¯è¨çèæé½è¯ä»·âè¿æ¯ä¸æ¬å°Javaè¯è¨è®²å¾ç¸å½ä¸éç书âã该书è°åäºjavaè¯è¨çå¾å¤ç»èï¼æ¯ä¸ä¸ªæ¹é¢é½æ¯ç¸å½æ·±å»çãéè¿æ¬ä¹¦ä½ å¯ä»¥çå°âä¸éçâjavaè¯è¨ã
ç½ç»ä¸å ³äºjavaè¯è¨è®²è§£çè§é¢å¾å¤å¾å¤ï¼å ¶ä¸ä¸å¡æåå¾ããç¿æºâJAVAè¯è¨ãå¯è½æ¯ä½ å¦ä¹ javaè¯è¨åºç¡çå¯ä¸éæ©ï¼è¯¥è®²åº§åºæ¬æç §ãThinkinginJavaãè¿æ¬ä¹¦è®²è§£ï¼å ¶ä¸ä¸å¡æç¿èå¸çå¾å¤æææçç¬è¯ãæå¾å¹¸è¿å¦ä¹ å°±æ¯ä»æ¤è§é¢å¼å§çãå 容å æ¬è®²ï¼ææ»å ±çäº3éã
ä¸è¿ï¼å¯¹äºåå¦è æä¸å¤ªæ¨è使ç¨ãThinking in Javaãï¼ææ¯è¾æ¨èPrentice Hall PTR çãCoreJava2ãå½å 称为ãJava 2 æ ¸å¿ææ¯ãï¼ç®åæ¯ç¬¬ä¸çãç½ç»ä¸å¤§å®¶é½å¯ä»¥ä¸è½½å°çµåçãOreillyçãJava inanutshellãä¹æ¯ä¸ä¸ªä¸éçéæ©ã读å®ä»¥ä¸ä¸¤æ¬åï¼ä½ å¯ä»¥ççç¿æºèå¸çè§é¢ï¼æ¥çå¯ä»¥ç 究ãThinking in Javaãäº
Matlab图像处理——的光影效果
随着手机摄影的普及,我们追求照片的生动与艺术感。本文将借助Matlab,教你如何为照片添加独特的光影效果,提升视觉冲击力。以下是实现这一过程的六个关键步骤: 1. 区域平滑:首先,使用高斯滤波器(imgaussfilt, sigma=3)对进行平滑处理,减少噪点,使图像更平滑。 2. 边缘检测:接着,利用Canny算法识别图像边缘,增强对比度,通过边缘减法突出线条质感。 3. 饱和度增强:进入HSV色彩空间,提升饱和度以增加鲜明度,通过rgb2hsv和hsv2rgb函数实现。 4. 色调分离:采用K-means聚类,将颜色分为几个类别,用调色板映射回RGB,赋予图像更丰富的层次感。 5. 手绘风格化:使用卷积核(imfilter)进行风格化处理,模拟手绘效果,增加艺术气息。 6. 光影添加:通过卷积核和混合模式,如highlight_filter和imfuse函数,为图像添加立体感和真实感,提升照片的立体视觉效果。 以下为实现这些效果的Matlab源代码示例。尽管原理简单,实际操作中需灵活运用函数和参数调整,以达到最佳效果。希望本文能启发你的创作灵感,让你的照片更具艺术感。如果你在Matlab或Python使用过程中遇到任何问题,随时向小英熊学长咨询。Catlike Coding Custom SRP学习之旅——Post Processing
来到了后处理环节,这是渲染管线中关键的一环。后处理技术能够显著提升画面效果,比如色调映射、Bloom、抗锯齿等,都能在后处理中实现。除了改善整体画面效果,后处理还能用于实现描边等美术效果。本文将主要介绍后处理堆栈和Bloom效果等内容。
考虑到篇幅和工作量,本文将从第4章节后半部分开始,以及未来的章节,主要提炼原教程的内容,尽量减少篇幅和实际代码。在我的Github工程中,包含了对源代码的详细注释,需要深入了解代码细节的读者可以查看我的Github工程。对于文章中的错误,欢迎读者批评指正。
以下是原教程链接和我的Github工程:
CatlikeCoding-SRP-Tutorial
我的Github工程
1. 后处理堆栈(Post-FX Stack)
FX,全称是Special Effects,即特殊效果,也称为VFX(Visual Special Effects),即视觉特效。参考维基百科,视觉效果(Visual effects,简称VFX)是在**制作中,在真人动作镜头之外创造或操纵图像的过程。游戏很多技术都会沿用影视技术上的一些技术,比如在色调映射时,可以采用ACES(**色调映射)等。关于Special Effects为什么叫FX,而不是SE,网上似乎只是因为FX谐音Effects,让人不知道从哪吐槽。
通常来说,因为后处理会包含很多不同的效果,如色调映射、Bloom、抗锯齿等等,因此后处理在渲染管线中的结构往往是一个堆栈式的结构(URP中也是如此,使用了Post Process Volume)。因此,在本篇中,我们将搭建这样一个堆栈结构,并实现Bloom效果。
1.1 配置资源(Settings Asset)
首先,我们定义PostFXSettings资源,即Scriptable Object,将其作为渲染管线的一项可配置属性,这样便于我们配置不同的后处理堆栈,并可以方便地切换。
1.2 栈对象(Stack Object)
类似于Light和Shadows,我们同样使用一个类来存储包括Camera、ScriptableRenderContext、PostFXSettings,并在其中执行后处理堆栈。
1.3 使用堆栈(Using the Stack)
在进行后处理前,我们首先需要获取当前摄像机画面的标识RenderTargetIdentifier,RenderTargetIdentifier用于标识CommandBuffer的RenderTexture。在这里,我们使用一个简单的int来标识sourceRT。
对于一个后处理效果而言,其实现过程说来很简单,传入一个矩形Mesh(其纹理即当前画面),使用一个Shader渲染该矩形Mesh,将其覆盖回Camera的RT上,我们通过Blit函数来实现该功能。
1.4 强制清除(Forced Clearing)
因为我们将摄像机渲染到了中间RT上,我们虽然会在每帧结束时释放该RT空间,但是基于Unity自身对RT的管理策略,其并不会真正地清除该RT,因此我们在下一帧时,该RT中会留存上一帧的渲染结果,导致了每一帧画面都是在前一帧的结果之上绘制的。
1.5 Gizmos
我们还需要在后处理前后绘制不同的Gizmos部分,这部分略~
1.6 自定义绘制(Custom Drawing)
使用Blit方法绘制后处理,实际上会绘制一个矩形,也就是2个三角面,即6个顶点。但我们完全可以只用一个三角面来绘制整个画面,因此我们使用自定义的绘制函数代替Blit。
1.7 屏蔽部分FX(Don't Always Apply FX)
目前,我们对于所有摄像机都执行了后处理。但是,我们希望只对Game视图和Scene视图摄像机进行后处理,并对不同Scene视图提供单独的开关控制。很简单,通过判断摄像机类型来屏蔽。
1.8 复制(Copying)
接下来,完善下Copy Pass。我们在片元着色器中,对原画面进行采样,并且由于其不存在Mip,我们可以指定mip等级0进行采样,避免一部分性能消耗。
2. 辉光(Bloom)
目前,我们已经实现了后处理堆栈的框架,接下来实现一个Bloom效果。Bloom效果应该非常常见,也是经常被用于美化画面,其主要作用就是让画面亮的区域更亮。
2.1 Bloom金字塔(Bloom Pyramid)
为了实现Bloom效果,我们需要提取画面中亮的像素,并让这些亮的像素影响周围暗的像素。因此,需要首先实现RT的降采样。通过降采样,我们可以很轻易地实现模糊功能。
2.2 配置辉光(Configurable Bloom)
通常来说,我们并不需要降采样到很小的尺寸,因此我们将最大降采样迭代次数和最小尺寸作为可配置选项。
2.3 高斯滤波(Gaussian Filtering)
目前,我们使用双线性滤波来实现降采样,这样的结果会有很多颗粒感,因此我们可以使用高斯滤波,并且使用更大的高斯核函数,通过9x9的高斯滤波加上双线性采样,实现x的模糊效果。
2.4 叠加模糊(Additive Blurring)
对于Bloom的增亮,我们直接将每次降采样后的Pyramid一步步叠加到原RT上,即直接让两张不同尺寸的以相同尺寸采样,叠加颜色,这一步也叫上采样。
2.5 双三次上采样(Bicubic Upsampling)
在上采样过程中,我们使用了双线性采样,这样可能依然会导致块状的模糊效果,因此我们可以增加双三次采样Bicubic Sampling的可选项,以此提供更高质量的上采样。
2.6 半分辨率(Half Resolution)
由于Bloom会渲染多张Pyramid,因此其消耗是比较大的,其实我们完全没必要从初始分辨率开始降采样,从一半的分辨率开始采样的效果也很好。
2.7 阈值(Threshold)
目前,我们对整个RT的每个像素都进行了增亮,这让这个画面看起来过曝了一般,但其实Bloom只需要对亮的区域增亮,本身暗的地方就不需要增亮了。
2.8 强度(Intensity)
最后,提供一个Intensity选项,控制Bloom的整体强度。
结束语
大功告成,我们在渲染管线中增加了后处理堆栈,以及实现了一个Bloom效果,其实在做完这篇之后,我觉得这个渲染管线才算基本上达成了大部分需要的功能,也算是一个里程碑吧。