TA不一样(十四)
前言本节介绍了几种常见的屏幕后处理BSC屏幕后处理中的‌BSC‌是最基础、最常用的色彩调整后处理组合全称为‌Brightness亮度、Saturation饱和度、Contrast对比度‌。Brightness亮度‌直接对画面所有像素的RGB分量进行统一的加法偏移整体提亮或压暗画面调整画面整体的明暗基调。Saturation饱和度‌控制色彩的鲜艳程度将像素颜色向灰度值饱和度为0或高饱和色彩饱和度大于1插值饱和度为0时画面完全变为黑白。Contrast对比度‌调整画面明暗反差将像素颜色以0.5灰度值为中心进行缩放提升对比度会让亮部更亮、暗部更暗降低对比度则画面整体发灰偏平。代码实现Shader MyCustom/BSC { Properties { _MainTex (Texture, 2D) white {} _Brightness (Brightness, Float) 1 _Saturation (Saturation, Float) 1 _Contrast (Contrast, Float) 1 } SubShader { Pass { ZTest Always Cull Off ZWrite Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include UnityCG.cginc struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _Brightness; float _Saturation; float _Contrast; // appdata_img 只包含顶点坐标和uv v2f vert (appdata_img v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv v.texcoord; return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 texColor tex2D(_MainTex, i.uv); // 明度 float3 finalColor texColor.rgb * _Brightness; // 饱和度 float3 greyColor 0.2125 * texColor.r 0.7154 * texColor.g 0.0721 * texColor.b; finalColor lerp(greyColor, finalColor, _Saturation); // 对比度 float3 midGreyColor float3(0.5, 0.5, 0.5); finalColor lerp(midGreyColor, finalColor, _Contrast); return float4(finalColor, 1); } ENDCG } } }边缘检测屏幕后处理边缘检测是一种直接在已渲染完成的画面上提取物体轮廓的特效技术广泛用于描边、卡通渲染、轮廓高亮等场景。它通过对屏幕纹理的像素邻域进行卷积采样计算像素间的灰度差梯度当梯度超过设定阈值时判定该像素属于边缘替换为指定的边缘颜色。最常用的算子是‌Sobel算子‌通过3×3的卷积核分别计算X、Y方向的梯度合成最终的边缘强度。代码实现Shader MyCustom/EdgeDetection { Properties { _MainTex (Texture, 2D) white {} _EdgeOnly (_EdgeOnly, Float) 1 _EdgeColor (_EdgeColor, Color) (1, 1, 1, 1) _EdgeBGC (_EdgeBGC, Color) (0, 0, 0, 1) } SubShader { Pass { ZTest Always Cull Off ZWrite Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include UnityCG.cginc struct v2f { float4 vertex : SV_POSITION; float2 uv[9] : TEXCOORD0; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _MainTex_TexelSize; float _EdgeOnly; float4 _EdgeColor; float4 _EdgeBGC; // appdata_img 只包含顶点坐标和uv v2f vert (appdata_img v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); // 邻点 o.uv[0] v.texcoord _MainTex_TexelSize.xy * float2(-1, -1); o.uv[1] v.texcoord _MainTex_TexelSize.xy * float2(0, -1); o.uv[2] v.texcoord _MainTex_TexelSize.xy * float2(1, -1); o.uv[3] v.texcoord _MainTex_TexelSize.xy * float2(-1, 0); o.uv[4] v.texcoord _MainTex_TexelSize.xy * float2(0, 0); o.uv[5] v.texcoord _MainTex_TexelSize.xy * float2(1, 0); o.uv[6] v.texcoord _MainTex_TexelSize.xy * float2(-1, 1); o.uv[7] v.texcoord _MainTex_TexelSize.xy * float2(0, 1); o.uv[8] v.texcoord _MainTex_TexelSize.xy * float2(1, 1); return o; } float greyColor(float4 texColor) { return 0.2125 * texColor.r 0.7154 * texColor.g 0.0721 * texColor.b; } // 使用算子计算边缘强度 float sobel(v2f i) { const float gx[9] {-1, -2, -1, 0, 0, 0, 1, 2, 1}; const float gy[9] {-1, 0, 1, -2, 0, 2, -1, 0, 1}; float texColor; float edgeX; float edgeY; for (int index 0; index 9; index) { texColor greyColor(tex2D(_MainTex, i.uv[index])); edgeX texColor * gx[index]; edgeY texColor * gy[index]; } float edge 1 - abs(edgeX) - abs(edgeY); return edge; } fixed4 frag (v2f i) : SV_Target { float edge sobel(i); float4 finalColor 1; // 边缘颜色 float3 edgeColor lerp(_EdgeColor, tex2D(_MainTex, i.uv[4]), edge); float3 bgc lerp(_EdgeColor, _EdgeBGC, edge); // 边缘和原图像混合 finalColor.rgb lerp(edgeColor, bgc, _EdgeOnly); return finalColor; } ENDCG } } }高斯模糊高斯模糊Gaussian Blur‌是屏幕后处理中最核心的图像平滑算法常用于模拟景深、运动模糊、 bloom 发光效果的基础预处理以及降低画面噪点。权重分配‌中心像素权重最高距离越远的邻域像素权重越低呈钟形曲线分布。加权平均‌对每个像素及其邻域像素进行加权求和实现平滑过渡。可分离性关键优化‌二维高斯核可以分解为‌水平方向‌和‌垂直方向‌两个一维核。这使得计算复杂度从 O(N2)O(N2) 降低到 O(2N)O(2N)极大提升了性能。为了利用可分离性通常分两个 Pass 实现‌Pass 1水平模糊‌读取源纹理沿 X 轴方向采样邻域像素应用一维高斯权重输出到中间纹理。‌Pass 2垂直模糊‌读取中间纹理沿 Y 轴方向采样邻域像素应用相同的一维高斯权重输出到最终屏幕。代码实现Shader MyCustom/GaussianBlur { Properties { _MainTex (Texture, 2D) white {} _BlurSize (_BlurSize, Float) 1 } SubShader { CGINCLUDE #include UnityCG.cginc struct v2f { float4 vertex : SV_POSITION; float2 uv[5] : TEXCOORD0; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _MainTex_TexelSize; float _BlurSize; // appdata_img 只包含顶点坐标和uv // 采集正负1和正负2的五个点5点高斯模糊Gaussian Blur v2f vertHorizontal (appdata_img v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv[0] v.texcoord _MainTex_TexelSize.xy * float2(0, 0); o.uv[1] v.texcoord _MainTex_TexelSize.xy * float2(1, 0) * _BlurSize; o.uv[2] v.texcoord _MainTex_TexelSize.xy * float2(2, 0) * _BlurSize; o.uv[3] v.texcoord _MainTex_TexelSize.xy * float2(-1, 0) * _BlurSize; o.uv[4] v.texcoord _MainTex_TexelSize.xy * float2(-2, 0) * _BlurSize; return o; } v2f vertVertical (appdata_img v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv[0] v.texcoord _MainTex_TexelSize.xy * float2(0, 0); o.uv[1] v.texcoord _MainTex_TexelSize.xy * float2(0, 1) * _BlurSize; o.uv[2] v.texcoord _MainTex_TexelSize.xy * float2(0, 2) * _BlurSize; o.uv[3] v.texcoord _MainTex_TexelSize.xy * float2(0, -1) * _BlurSize; o.uv[4] v.texcoord _MainTex_TexelSize.xy * float2(0, -2) * _BlurSize; return o; } fixed4 frag (v2f i) : SV_Target { // 加强平均 float weight[3] {0.4026, 0.2442, 0.0545}; float3 sumColor tex2D(_MainTex, i.uv[0]).rgb * weight[0]; for(int index 1; index 3; index) { sumColor tex2D(_MainTex, i.uv[index]).rgb * weight[index]; sumColor tex2D(_MainTex, i.uv[index 2]).rgb * weight[index]; } //sumColor 0; //for(int index 0; index 5; index) //{ // sumColor tex2D(_MainTex, i.uv[index]).rgb * 0.2; //} float4 finalColor 1; finalColor.rgb sumColor; return finalColor; } ENDCG ZTest Always ZWrite Off Cull Off // 横向纵向分为两个Pass进行计算 Pass { NAME GaussianBlurVertical CGPROGRAM #pragma vertex vertVertical #pragma fragment frag ENDCG } Pass { NAME GaussianBlurHorizontal CGPROGRAM #pragma vertex vertHorizontal #pragma fragment frag ENDCG } } }BloomBloom泛光/辉光‌是模拟真实相机镜头光晕的经典屏幕后处理特效能让画面中高亮区域向外扩散出柔和的发光效果大幅提升画面氛围感和真实感。Bloom的核心逻辑是‌“提取高亮→高斯模糊→叠加回原画面”‌三步流程高亮提取‌从原画面中筛选出亮度超过设定阈值的像素过滤掉暗部区域只保留画面中本该发光的部分如太阳、灯光、金属高光。‌高斯模糊‌对提取出的高亮图执行多次降分辨率高斯模糊让高亮区域向外扩散出柔和的光晕这一步可以直接复用你之前写好的高斯模糊Shader。‌叠加混合‌将模糊后的光晕图通过加法混合的方式叠加回原始画面最终得到泛光效果。代码实现Shader MyCustom/Bloom { Properties { _MainTex (Texture, 2D) white {} _BrightnessTex (_BrightnessTex, 2D) white {} _BlurSize (_BlurSize, Float) 1 _GreyThreshold (_GreyThreshold, Float) 1 } SubShader { CGINCLUDE #include UnityCG.cginc sampler2D _MainTex; float4 _MainTex_ST; sampler2D _BrightnessTex; float4 _MainTex_TexelSize; float _BlurSize; float _GreyThreshold; struct v2f { float4 vertex : SV_POSITION; float2 uv : TEXCOORD0; }; v2f vert(appdata_img v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv v.texcoord; return o; } float greyColor(float4 texColor) { return 0.2125 * texColor.r 0.7154 * texColor.g 0.0721 * texColor.b; } // 高亮提取‌, 从灰度图过滤 fixed4 fragBrightness (v2f i) : SV_Target { float4 texColor tex2D(_MainTex, i.uv); float brightness saturate(greyColor(texColor) - _GreyThreshold); return texColor * brightness; } // 叠加原图和光晕图 // Bloom通常在HDR色彩空间下计算配合ACES色调映射能避免泛光过曝发白得到更自然的发光色彩。_BrightnessTex是处理过的图片 fixed4 fragBloom (v2f i) : SV_Target { float4 texColor tex2D(_MainTex, i.uv); float4 brightnessColor tex2D(_BrightnessTex, i.uv); return texColor brightnessColor; } ENDCG ZTest Always ZWrite Off Cull Off // 高亮提取 Pass { CGPROGRAM #pragma vertex vert #pragma fragment fragBrightness ENDCG } // 高斯模糊 UsePass MyCustom/GaussianBlur/GaussianBlurVertical UsePass MyCustom/GaussianBlur/GaussianBlurHorizontal // 混合 Pass { CGPROGRAM #pragma vertex vert #pragma fragment fragBloom ENDCG } } }简易运动模糊使用透明度混合Alpha Blending‌或‌残影叠加‌的简化写法完成静态运动模糊实现将当前渲染的画面合到‌上一帧保留在屏幕缓冲区Back Buffer的画面‌上没有利用速度向量Velocity Vector或历史帧重投影无法产生基于物体运动方向的真实拖影。代码实现Shader MyCustom/MotionBlur { Properties { _MainTex (Texture, 2D) white {} _MotionBlurAmount (_MotionBlurAmount, Float) 1 } SubShader { CGINCLUDE #include UnityCG.cginc struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _MotionBlurAmount; // appdata_img 只包含顶点坐标和uv v2f vert (appdata_img v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv v.texcoord; return o; } fixed4 fragBlurAmount (v2f i) : SV_Target { // sample the texture fixed4 texColor tex2D(_MainTex, i.uv); texColor.a _MotionBlurAmount; return texColor; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 texColor tex2D(_MainTex, i.uv); return texColor; } ENDCG ZTest Always Cull Off ZWrite Off // 简单实现透明度叠加 Pass { Blend SrcAlpha OneMinusSrcAlpha ColorMask RGB CGPROGRAM #pragma vertex vert #pragma fragment fragBlurAmount ENDCG } Pass { Blend One Zero ColorMask A // 不让最终生成的纹理受到A通道的影响 CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } } }

相关新闻

pycharm下载库但是运行还是提示库没有下载问题

pycharm下载库但是运行还是提示库没有下载问题

明明下载成功但是运行出现File "E:\python_study\ctf\test\reverse\ida套壳.py", line 1, in <module>import pefile ModuleNotFoundError: No module named pefile这是一个非常经典的 Python 环境问题&#xff1a;pip 安装到的 Python 解释器&#xff0c;和你…

2026/7/13 4:40:31阅读更多 →
Ansys Fluent仿真核心:从物理模型选择到边界条件设置的工程实践

Ansys Fluent仿真核心:从物理模型选择到边界条件设置的工程实践

第一次打开 Ansys Fluent 时&#xff0c;很多人会陷入一个误区&#xff1a;以为只要把网格导进去、选个模型、点个计算&#xff0c;就能得到漂亮的流场动画。但真正做过工程仿真的人都知道&#xff0c;Fluent 最难的不是操作界面&#xff0c;而是如何让软件“相信”你设置的物理…

2026/7/13 4:40:31阅读更多 →
别错过机会!2026亲测靠谱的AI论文写作工具|实测必入避坑版

别错过机会!2026亲测靠谱的AI论文写作工具|实测必入避坑版

2026 年学术写作工具已高度分化&#xff0c;千笔AI与ThouPen为全流程首选&#xff0c;豆包、DeepSeek 为专项强手&#xff1b;避坑关键&#xff1a;拒绝假文献、严控 AIGC 率、优先国内适配、免费试用先行。一、TOP3 全流程首选&#xff08;亲测不踩雷&#xff09; 1. 千笔AI&a…

2026/7/13 4:35:31阅读更多 →
YimMenu完整指南:免费GTA5增强工具快速上手教程

YimMenu完整指南:免费GTA5增强工具快速上手教程

YimMenu完整指南&#xff1a;免费GTA5增强工具快速上手教程 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …

2026/7/13 5:45:37阅读更多 →
C++中运算符重载详解及其作用介绍

C++中运算符重载详解及其作用介绍

概述运算符重载 (Operator Overloading)函数重载重载: 将同一名字重新赋予新的含义. 函数重载: 对一个函数赋予新的含义, 使之实现新功能. 例如:12int max(int x, int y);double max(double a, double b, double c);运算符也有重载: 赋予运算符新的含义, 使之一名多用. 例如123…

2026/7/13 5:45:37阅读更多 →
混合专家模型(MoE)原理与在视觉语言模型(VLA)中的实践指南

混合专家模型(MoE)原理与在视觉语言模型(VLA)中的实践指南

在AI模型快速发展的今天&#xff0c;如何平衡模型性能与计算效率成为业界关注的焦点。混合专家模型&#xff08;MoE&#xff09;作为解决这一难题的创新架构&#xff0c;正在引领新一代AI模型的设计方向。本文将深入解析MoE的核心原理、技术实现及其在视觉语言模型&#xff08;…

2026/7/13 5:45:37阅读更多 →
EdgeRemover:Windows系统彻底卸载Microsoft Edge的专业级解决方案

EdgeRemover:Windows系统彻底卸载Microsoft Edge的专业级解决方案

EdgeRemover&#xff1a;Windows系统彻底卸载Microsoft Edge的专业级解决方案 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemove…

2026/7/13 5:45:37阅读更多 →
Git 浅克隆后恢复完整仓库的 3 种方法对比:配置修改 vs --unshallow vs 重新克隆

Git 浅克隆后恢复完整仓库的 3 种方法对比:配置修改 vs --unshallow vs 重新克隆

Git浅克隆后恢复完整仓库的深度技术解析与方案选型指南1. 浅克隆技术原理与典型应用场景浅克隆&#xff08;Shallow Clone&#xff09;作为Git的高级功能&#xff0c;通过--depth参数实现了部分历史记录的获取。其核心机制是创建一个仅包含指定深度提交记录的仓库副本&#xff…

2026/7/13 5:45:37阅读更多 →
Node.js 18+ 开发环境 HTTP 431 报错:3种主流构建工具(Vite/Webpack/Vue CLI)的 `--max-http-header-size` 配置实战

Node.js 18+ 开发环境 HTTP 431 报错:3种主流构建工具(Vite/Webpack/Vue CLI)的 `--max-http-header-size` 配置实战

Node.js 18 开发环境 HTTP 431 报错&#xff1a;3种主流构建工具的--max-http-header-size配置实战当你在使用 Node.js 18 进行前端开发时&#xff0c;突然遇到 HTTP 431 错误&#xff08;Request Header Fields Too Large&#xff09;&#xff0c;这通常意味着你的请求头过大&…

2026/7/13 5:40:37阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比&#xff1a;全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时&#xff0c;第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件&#xff1a;5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL&#xff1a;跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出&#xff08;提出问题&#xff09;重组肠激酶是融合标签切除核心工具酶&#xff0c;当前原核表达体系存在三大标准化难题&#xff0c;直接阻碍可复现的蛋白质分离纯化流程搭建&#xff1a;Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体&#xff0c;沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools&#xff1a;让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握&#xff1a;从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →