当前位置: 首页 > article >正文

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,结束!我还叠加了一个后处理效果,相当于加一个滤镜,这个不重要 

 

 


http://www.kler.cn/a/597546.html

相关文章:

  • Python入门基础
  • Java主流开发框架之请求响应常用注释
  • 避雷 :C语言中 scanf() 函数的错误❌使用!!!
  • Axios 和 跨域 这两个概念
  • IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法
  • 自用基于 TypeScript 的 WebSocket 客户端封装
  • 数据结构--顺序查找
  • 【C语言】深入理解指针(一):从基础到高级应用
  • 【第19节】windows sdk编程:文件I/O
  • 麒麟操作系统作为服务器,并且需要在浏览器上调试 MATLAB
  • Linux 内核源码阅读——ipv4
  • Linux系统管理与编程10:任务驱动综合应用
  • Github 2025-03-19 C开源项目日报 Top4
  • GPT-5 将免费向所有用户开放?
  • 雷池SafeLine-自定义URL规则拦截非法请求
  • 计算机网络——通信基础和传输介质
  • 深入理解 Collections.emptyList():优雅处理空列表的利器!!!
  • 【Nodejs】2024 汇总现状
  • SAP SD学习笔记33 - 预詑品(寄售物料),预詑品引渡(KB),预詑品出库(KE)
  • Nginx基于SSL的TCP代理