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

概述

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

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

那就是URP自带的OpaqueTexture。

在ShaderGraph的节点就是SceneColor。

Unity URP管线如何截屏,及热扰动(热扭曲)效果的实现_第1张图片

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

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

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

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

获取截屏的具体实现

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

Unity URP管线如何截屏,及热扰动(热扭曲)效果的实现_第2张图片

接着,在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;
}

效果如下: 

Unity URP管线如何截屏,及热扰动(热扭曲)效果的实现_第3张图片

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

参考文章:

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

源码及资源下载:

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

 

你可能感兴趣的:(shader,渲染,Unity,unity,shader)