Unity URP管线如何截屏,及热扰动(热扭曲)效果的实现

您所在的位置:网站首页 完全透明的物体 Unity URP管线如何截屏,及热扰动(热扭曲)效果的实现

Unity URP管线如何截屏,及热扰动(热扭曲)效果的实现

2023-10-07 01:32| 来源: 网络整理| 查看: 265

概述

URP管线环境下,GrabPass是失效的。

那么,有什么替代方法呢。除了RenderTexture以外,今天发现了一个方法。

那就是URP自带的OpaqueTexture。

在ShaderGraph的节点就是SceneColor。

顾名思义,OpaqueTexture就是渲染完不透明物体后截屏的图,我没完全明白为什么Unity不把半透明的物体也截进去。

有可能是因为某些设备半透明物体必须在完全渲染完毕后才能输出到屏幕上,而截屏等不到那一个阶段,因为截屏的图片也用于

渲染物体呀,这就存在一个先后问题,可能处理起来更麻烦。unity为了避免麻烦,只等待渲染完不透明物体的时候截屏。

如果想把半透明物体也截屏,可能要用RenderTexture或者求助其他办法。我现在没想到更好的办法。

获取截屏的具体实现

首先,在Pipeline Asset里勾选上Opaque Texture。

接着,在shader代码里。添加

SAMPLER(_CameraOpaqueTexture);

再接着, 采样_CameraOpaqueTexture的uv,也就是屏幕uv,计算如下:

其中,i.vertex是我们的clip space下的顶点坐标。

half2 uv = i.vertex.xy / _ScreenParams.xy;

 直接采样即可。

half4 col = tex2D(_CameraOpaqueTexture, uv);

 热扰动(热扭曲)的具体实现

既然截屏都能拿到了,何不做个效果呢,比如热扰动,算是比较简单实用的效果。

热扰动,其实就是利用采样噪声贴图的数据,再对采样截屏贴图的uv进行扰动,达到扭曲的效果。

代码很简单,如下:

half4 frag( v2f i ) : SV_Target { //noise effect half4 offsetColor1 = tex2D(_NoiseTex, i.uvmain + _Time.xz*_HeatTime); half4 offsetColor2 = tex2D(_NoiseTex, i.uvmain - _Time.yx*_HeatTime); half distortX = ((offsetColor1.r + offsetColor2.r) - 1) * _HeatForce; half distorty = ((offsetColor1.g + offsetColor2.g) - 1) * _HeatForce; half2 screenUV = (i.vertex.xy / _ScreenParams.xy)+ float2(distortX, distorty); half4 col = tex2D(_CameraOpaqueTexture, screenUV); col.a = 1.0f; return col; }

效果如下: 

有需要的同学可以通过底部的资源链接下载。

参考文章:

https://www.bilibili.com/read/cv6504414/

源码及资源下载:

链接:https://pan.baidu.com/s/1IVaav8d3Xhbaag5W-UfGgg  提取码:4tvl

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3