了解command buffer

CommandBuffer携带一系列的渲染命令,可以指定在相机渲染的某个点执行本身命令(包括特殊渲染,保存当前rendertexture等)

CommandBuffer可以使用的点看这里(官网文档)

具体渲染流程和触发点如下

特效扭曲的实现原理以及方案

原理:就是抓取特效后面渲染的纹理进行扰动

方案1:抓取特效后面渲染的纹理一般用grabpass,根据grabpass进行扰动

方案2:利用command buffer在渲染天空盒之后保存一张屏幕纹理(特效渲染之前的纹理),然后抓取对应位置的纹理进行扰动

方案1总结:很多手机不兼容,而且性能很一般,所以手游暂时不可能使用

方案2总结:性能可以,有个层次问题,如果扭曲的特效在物体后面,扰动会出现前面的物体,不过为了性能我觉得问题不大,也能达到一定效果

下面效果图就是使用方案2

代码实现

代码实现难度不高

保存AfterSkybox渲染之后的纹理,然后设置全局纹理

        m_AfterSkyboxCommandBuffer.Blit(BuiltinRenderTextureType.CurrentActive, m_AfterSkyboxTex);//设置摄像机触发commandbuffer时机m_Camera.AddCommandBuffer(CameraEvent.AfterSkybox, m_AfterSkyboxCommandBuffer);//设置shader全局图片,方便给扭曲效果用Shader.SetGlobalTexture(m_AfterSkyboxTexId, m_AfterSkyboxTex);

全局纹理的声明

    /// <summary>/// 在天空盒渲染之后保存的图片id(就是特效渲染之前)/// </summary>private static int m_AfterSkyboxTexId = Shader.PropertyToID("_AfterSkyboxTex");

shader全局纹理使用,直接shader里面这么声明就可以使用

sampler2D _AfterSkyboxTex;

工程比较简单直接放代码,如果有需要后方再放工程

using UnityEngine;
using UnityEngine.Rendering;
/// <summary>
/// Pieken 2020
/// </summary>
public class RenderMgr : MonoBehaviour
{/// <summary>/// 当前摄像机/// </summary>private Camera m_Camera;/// <summary>/// 屏幕波纹扭曲 演示屏幕后处理怎么写,功能是有/// </summary>public Material ScreenWaveDistortion;/// <summary>/// 在天空盒渲染之后保存的图片id(就是特效渲染之前)/// </summary>private static int m_AfterSkyboxTexId = Shader.PropertyToID("_AfterSkyboxTex");/// <summary>/// 在天空盒渲染之后保存的图片(就是特效渲染之前)/// </summary>private RenderTexture m_AfterSkyboxTex;/// <summary>/// 当前摄像机渲染最终的图片/// </summary>private RenderTexture m_CameraRenderTex;/// <summary>/// 在渲染天空盒之后的commandbuff指令/// </summary>private CommandBuffer m_AfterSkyboxCommandBuffer;private void Start(){m_Camera = GetComponent<Camera>();Init();}private void Init(){//获取一张纹理m_AfterSkyboxTex = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.Default);m_AfterSkyboxTex.name = "AfterSkyboxTex";//新建一个commandbufferm_AfterSkyboxCommandBuffer = new CommandBuffer();m_AfterSkyboxCommandBuffer.name = "AfterSkyBox_CommandBuffer";//buffer之类把当前渲染出来的图片保存到m_AfterSkyboxTexm_AfterSkyboxCommandBuffer.Blit(BuiltinRenderTextureType.CurrentActive, m_AfterSkyboxTex);//设置摄像机触发commandbuffer时机m_Camera.AddCommandBuffer(CameraEvent.AfterSkybox, m_AfterSkyboxCommandBuffer);//设置shader全局图片,方便给扭曲效果用Shader.SetGlobalTexture(m_AfterSkyboxTexId, m_AfterSkyboxTex);}private void OnPreRender(){if (QualitySettings.antiAliasing == 0){m_CameraRenderTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Default);}else{m_CameraRenderTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Default, QualitySettings.antiAliasing);}m_Camera.targetTexture = m_CameraRenderTex;}private void OnPostRender(){m_Camera.targetTexture = null;//测试后处理,屏幕波纹扭曲 正常这么写Graphics.Blit(m_CameraRenderTex, null as RenderTexture);Graphics.Blit(m_CameraRenderTex, null as RenderTexture, ScreenWaveDistortion);RenderTexture.ReleaseTemporary(m_CameraRenderTex);}/// <summary>/// 删除CommandBuffer相关/// </summary>private void DestroyCommandBuffer(){Destroy(m_AfterSkyboxTex);if (m_AfterSkyboxCommandBuffer != null){m_Camera.RemoveCommandBuffer(CameraEvent.AfterSkybox, m_AfterSkyboxCommandBuffer);m_AfterSkyboxCommandBuffer.Dispose();m_AfterSkyboxCommandBuffer = null;}}private void OnDestroy(){DestroyCommandBuffer();}
}

扭曲使用的shader

Shader "Effect/Particle/Distortion/Add"
{Properties{_MainTex("Particle Texture", 2D) = "white" {}//噪音图_Noise("Noise", 2D) = "white" {}_distortFactorTime("FactorTime",Range(0,5)) = 0.5_distortFactor("factor",Range(0.04,1)) = 0}SubShader{Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" }Blend SrcAlpha OneLOD 100Cull Off Lighting Off ZWrite OffPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#pragma multi_compile_particles#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float4 grabPos:TEXCOORD1;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _Noise;float4 _Noise_ST;fixed _distortFactorTime;fixed _distortFactor;sampler2D _AfterSkyboxTex;v2f vert(appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.grabPos = ComputeGrabScreenPos(o.vertex);return o;}fixed4 frag(v2f i) : SV_Target{float2 tempuv = i.uv + _Time.xy*_distortFactorTime;fixed4 col = tex2D(_Noise, tempuv);i.grabPos.xy += col.xy*_distortFactor;half4 color = tex2D(_MainTex, i.uv) * 2;half4 bgcolor = tex2Dproj(_AfterSkyboxTex, i.grabPos) * 0.5;color.a = saturate(color.a);bgcolor.a = color.a;return bgcolor * color;}ENDCG}}
}

总结

这种使用commandbuffer获取一张纹理进行扭曲,虽然层次会出现问题,但是性能可以也能达到一定效果

下面是几年前崩坏3技术分享的原话

我们在崩坏3的场景中较多的使用了屏幕扭曲效果,比如刀剑的拖尾特效,时空断裂效果,水流瀑布及其他场景效果。在渲染扭曲效果的过程中,我们使用3个通道来存储扭曲的渲染结果,两个用于存储uv偏移,另一个用于存储扭曲强度mask,扭曲强度mask用于执行深度剪裁和基于距离的强度控制。使用单独的pass渲染扭曲结果到帧缓冲纹理对于移动平台来说开销较大,所以我们在最终的后处理中整合应用了扭曲效果,相比前者要快很多。 但这种方法也可能导致靠前面的物体由于没有分层处理而混入后面扭曲材质的问题,不过考虑到移动平台的性能限制,相对于整体效果而言这种妥协是值得的。

最近研究开放世界场景加载,应该一段时间不写博客

Unity 特效扭曲效果(使用command buffer实现)相关推荐

  1. unity Shader 扭曲效果

    原理 所谓扭曲就是扰动一个物体的uv坐标,表现出来就是一个扰动效果,如火焰扭曲空气,和水波对水底的影响. 1. 在shader 中我们需要一张当前渲染的纹理 2. 给一个物体渲染并使用当前纹理,用屏幕 ...

  2. Unity 屏幕特效 之 热浪扭曲效果的实现

    Unity 屏幕特效 之 热浪扭曲效果的实现 目录 Unity 屏幕特效 之 热浪扭曲效果的实现 一.简介 二.关键技术

  3. Unity Shader-热空气扭曲效果(多种实现方案,包括移动平台)

    原文地址:https://blog.csdn.net/puppet_master/article/details/70199330 简介 千等万等终于等到了<耻辱2>打折,本以为可以爽一发 ...

  4. python 画三角形matli_Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例

    本文实例讲述了Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果.分享给大家供大家参考,具体如下: 这里用 Python 实现 PS 滤镜特效,Marble Filter, 这种滤 ...

  5. unityShader热空气扭曲效果

    本文转载自http://blog.csdn.net/puppet_master/article/details/70199330?locationNum=2&fps=1 简介 千等万等终于等到 ...

  6. psql屏幕输出全部结果_CommandBuffer实现Distort屏幕扭曲效果

    现在的游戏中很多特效都喜欢用到扭曲效果,常见的实现方案都是在Shader中使用GrabPass,来获取屏幕的画面然后去做计算.关于获取屏幕画面的几种方案的性能分析可以参考我上篇文章. idleworm ...

  7. 【TA-霜狼_may-《百人计划》】图形3.7.2 command buffer简

    [TA-霜狼_may-<百人计划>]图形3.72command buffer 及urp概述 @[TOC]([TA-霜狼_may-<百人计划>]图形3.72command buf ...

  8. AfterEffect插件--常规功能开发--扭曲效果--js脚本开发--AE插件

    文章目录 1.扭曲效果功能 2.作者答疑 1.扭曲效果功能   AfterEffect(AE)插件是Adobe公司开发的特效制作软件,稳定快速的功能和特效,在视频制作领域使用非常广泛,本文向大家介绍如 ...

  9. 扭曲效果 效率优化 GrapPass,CommandBuffer对比

    屏幕图像捕捉: Shader的GrabPass GrabPass可以很方便地捕获当前渲染时刻的FrameBuffer中的图像. 其原理就是从当前FrameBuffer中copy一份纹理,通过SetTe ...

最新文章

  1. 【linux】error: stdio.h: No such file or directory
  2. 从神经科学到计算机视觉:人类与计算机视觉五十年回顾
  3. 聚合(根)、实体、值对象精炼思考总结
  4. Bug人生---超越bug杀手
  5. c语言c判断字符数字,c语言问题求教 利用函数判断字符串中是否全为数字
  6. crontab 日志_Nginx日志切割并计划任务自动上传到FTP服务器
  7. 智能指针(一):STL auto_ptr实现原理
  8. 机器面试-处理分类问题
  9. Android编译判定BoardConfig.mk的宏控是否打开或者有效的验证方法
  10. 防止各大网盘下载限速解决方案--idman
  11. 声卡loopback有什么用_sam机架宿主软件无法获取声卡ASIO问题解析
  12. ios开发快速入门教程
  13. PHP后台数据处理及与web端进行数据交互
  14. reverse-for-the-holy-grail-350 攻防世界
  15. html在线商城购物网站制作——基于HTML+CSS+JavaScript(oppo手机商城 6页)
  16. Java基础入门:IDEA软件安装和软件初始化设置
  17. 分治法 —— 快速幂
  18. MATLAB 求圆形面积
  19. 【北京科技大学成绩单打印网址】【中科院自动化所邮箱登录网址】等
  20. OpenCV和Python进行SIFT算法——两张图片的关键点匹配

热门文章

  1. Cascade R-CNN详解
  2. linux p2v步骤,P2V操作完整步骤,物理机转换openstack虚拟机
  3. Linux Text file busy文本文件忙
  4. c语言头文件的作用,C语言头文件作用是什么?
  5. [转]dedeCMS SEO实战
  6. 2023版D盾防火墙v2.1.7.2,主动防御保护,以内外保护的方式 防止网站和服务器给入侵。限制了常见的入侵方法,让服务器更安全
  7. PCB线路板蛇形布线要注意哪些问题?
  8. 使用WebAudio实现音频音波可视化
  9. python线程挂起唤醒暂停按键_time.sleep在python中挂起多线程函数
  10. kafka启用Kerberos认证