首先URP官方已经给了很详细的实现方案,知乎参考链接:https://zhuanlan.zhihu.com/p/248903320
原理就是在渲染所有3D和UI之后通过URP的Cbuffer shader进行屏幕抓取,然后再对抓到的图进行高斯模糊,然后映射到指定的毛玻璃效果的图上。
URP设置
默认的ForwardRender里 层级过滤设为所有,UI层级也好,毛玻璃层级也好都需要被渲染
GrabColor里:通过指定的Blurshader指定抓屏的层级(去掉毛玻璃层),开启抓屏并保存,然后经过高斯模糊,输出到指定的TextureName的RT上。
对需要实现毛玻璃效果的物体添加毛玻璃材质球,此材质球的shader中使用上一步获得的RT,映射出毛玻璃效果
此操作涉及到三个重点:1.URP设置 2.抓屏shader 3.毛玻璃效果shader
抓屏Shader
Shader "WeiLe/Blur_Gaussian"
{
Properties
{
blurRangeX("Blur x", float) = 1
blurRangeY("Blur y", float) = 1
}
SubShader
{
Tags {
"RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"}
LOD 100
Pass //pass 0
{
Name "BlurX"
ZTest Always
ZWrite Off
Cull Off
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
};
CBUFFER_START(UnityPerMaterial)
float4 _SourceTex_Blur1_ST;
float blurRangeX = 1;
float4 _SourceTex_Blur1_TexelSize;
CBUFFER_END
TEXTURE2D (_SourceTex_Blur1);
SAMPLER(sampler_SourceTex_Blur1);
#define SampleCount 10
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
o.positionCS = TransformObjectToHClip(v.positionOS.xyz);
o.uv.xy = TRANSFORM_TEX(v.uv.xy, _SourceTex_Blur1);
return o;
}
half4 frag(Varyings i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
half4 col = 0;
int s =