unity urp 扭曲效果(半透明物体也可扭曲)
需求描述:实现指定摄像机的热扭曲效果,并且半透明效果也是可以被扭曲的。
步骤:
1.制作扭曲shader:
Shader "Unlit/HeatDistortion"
{
Properties {
_NoiseTex ("噪声贴图", 2D) = "white" {}
_DistortStrength ("扭曲强度", Range(0, 0.1)) = 0.05
_Speed ("速度", Float) = 1.0
}
SubShader {
Tags {
"RenderType" = "Transparent"
"Queue" = "Transparent" // 确保在透明物体后渲染
}
Pass {
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
TEXTURE2D(_NoiseTex);
SAMPLER(sampler_NoiseTex);
TEXTURE2D(_CameraOpaqueTexture);
SAMPLER(sampler_CameraOpaqueTexture);
float _DistortStrength, _Speed;
struct Attributes {
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings {
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
float4 screenPos : TEXCOORD1;
};
Varyings vert(Attributes input) {
Varyings output;
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
output.positionCS = vertexInput.positionCS;
output.uv = input.uv;
output.screenPos = ComputeScreenPos(output.positionCS);
return output;
}
half4 frag(Varyings input) : SV_Target {
// 动态采样噪声贴图
float2 noiseUV = input.uv + _Time.y * _Speed * 0.1;
float2 noise = SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, noiseUV).rg;
// 计算 UV 偏移
float2 distort = (noise * 2 - 1) * _DistortStrength;
float2 screenUV = (input.screenPos.xy / input.screenPos.w) + distort;
// 采样屏幕纹理
half4 color = SAMPLE_TEXTURE2D(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, screenUV);
return color;
}
ENDHLSL
}
}
}
2.制作shader对应的材质
选择材质的shader为刚创建的shader,并且拖入噪声图片。
3. 制作并设置quad
在Hierarchy面板右键->3D Object->quad,将新建材质拖入quad中
3.拖拽quad
将面板拖拽到摄像机前方,此时会发现摄像机拍摄的 render texture 已经发生扭曲,但是半透明物体(比如粒子和VFX)都看不到了
4. 新建并且设置layer
新建一个layer为DistortionLayer,并且将半透明物体的layer设置为DistortionLayer
5.设置摄像机的renderer
先找到摄像机使用的renderer,如果是Default,那么真实使用的就是0号renderer data
在Project面板中搜索这个renderer data(应该是在settings文件夹中)。
找到后点击Add Renderer Feature 添加一个render object,并且按照图所示去配置。命名为VFX Transparent(啥名字都可以,无所谓)
我们会发现game视图中已经可以看到被扭曲的半透明物体了。搞定!