Unity urp实现红外效果(分层渲染,特效覆盖)
1.描述:
实现一个红外窗口,指定摄像机拍摄的图片渲染到raw Image,在窗口中模拟红外效果,但是实际物体的颜色没有发生改变。
2.效果预览:
物体实际颜色:
”红外“窗口:
3.实现步骤
(1) 创建图层(Layer Management)
新建layer,命名为HighTemperature,将高温物体分配到HighTemperature
层
(2)新建两个shader(高温和低温)
高温shader命名为HighTemperature。有渐变和光晕效果(模拟真实红外效果)
代码:
Shader "CustomRenderTexture/HighTemperature"
{
Properties {
_EdgeWidth ("边缘宽度", Range(0, 2)) = 0.1
_GlowIntensity ("发光强度", Range(0, 5)) = 0.5
}
SubShader {
Tags {
"RenderType"="Opaque"
"Queue"="Geometry"
}
Pass {
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes {
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
};
struct Varyings {
float4 positionCS : SV_POSITION;
float3 viewDir : TEXCOORD0;
float3 normal : TEXCOORD1;
};
CBUFFER_START(UnityPerMaterial)
float _EdgeWidth;
float _GlowIntensity;
CBUFFER_END
Varyings vert(Attributes input) {
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
// 计算视角方向
float3 worldPos = TransformObjectToWorld(input.positionOS.xyz);
output.viewDir = normalize(_WorldSpaceCameraPos - worldPos);
// 转换法线到世界空间
output.normal = TransformObjectToWorldNormal(input.normalOS);
return output;
}
half4 frag(Varyings input) : SV_Target {
// 计算菲涅尔效应
float fresnel = 1.0 - saturate(dot(input.normal, input.viewDir));
fresnel = pow(fresnel, _EdgeWidth);
// 颜色渐变:红→黄
float3 baseColor = float3(1, 0, 0); // 红色
float3 glowColor = float3(1, 1, 0); // 黄色
// 混合颜色
float3 finalColor = lerp(baseColor, glowColor, fresnel);
// 添加发光强度
finalColor *= _GlowIntensity * (fresnel + 0.2);
return half4(finalColor, 1.0);
}
ENDHLSL
}
}
}
低温shader命名为: InfraredBackground
代码为:
Shader "CustomRenderTexture/InfraredBackground"
{
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata { float4 vertex : POSITION; };
struct v2f { float4 pos : SV_POSITION; };
v2f vert(appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); return o; }
fixed4 frag(v2f i) : SV_Target { return fixed4(0,0,1,1); } // 纯蓝色
ENDCG
}
}
}
(4).为两个shader新建material
分别命名为Met_Red和Met_Blue,将Met_Red的shader换成HighTemperature(我们新建的高温shader)。将Met_Blue的shader换成InfraredBackground。
(5).新建camera、render texture和raw image
在project中右击->Create->Rendering->Rendering Texture,命名为:Infrared Small Follow Render Texture
在Hierachy面板中右击->UI->Raw Image。
将Infrared Small Follow Render Texture拖拽到raw image的texture中。
新建camera并且 将Infrared Small Follow Render Texture拖拽到Output Texture中
这个步骤是:将摄像机拍摄的内容渲染到 render texture上,render texture在raw image上展示。
(6)新建renderer data
我的方式是找到renderer asset 然后复制现在有的默认renderer data,在此基础上修改,肯定有别的方式,大家可以自己摸索一下。
具体:
一、找renderer asset:菜单栏中点击Edit->Project Setting->Graphics->Default Render Pipeline->点击PC_RPAsset(你的可能不一样名字)
二、复制并修改renderer data:找到renderer Asset中的renderer List中第一个renderer data,然后复制 ,命名为PC_Renderer_Infrared
三、 配置renderer data:
添加Renderer Features:
- 打开PC_Renderer_Infrared,点击
Add Renderer Feature
选择Render Objects
高温物体设置:
- 名称改为
HighTemperature Render
- Filter → Layer Mask 选择
HighTemperature
- Override Material 选择
Mat_Red
背景设置:
- 再次添加
Render Objects
- 名称改为
Background Render
- Filter → Layer Mask 选择 Everything,再取消勾选
HighTemperature
- Override Material 选择
Mat_Blue
四、配置renderer asset和camera
在renderer asset的renderer list中点击+,添加PC_Renderer_Infrared
在camera中选择renderer为 PC_Renderer_Infrared
ok,结束!我还叠加了一个后处理效果,相当于加一个滤镜,这个不重要