Unity3D实现红外热成像效果
创作时间:
作者:
@小白创作中心
Unity3D实现红外热成像效果
引用
CSDN
1.
https://blog.csdn.net/zouxin_88/article/details/124181857
在Unity3D中实现红外热成像效果是一个有趣且实用的技术挑战。本文将详细介绍如何通过设置图层、创建相机、使用RenderTexture、编写C#脚本以及创建shader等步骤,实现一个基本的红外热成像效果。
实现步骤
设置图层
将需要在红外图像中高亮的物体设置到图层PostProcessing。创建相机CameraHighLight
新建一个相机CameraHighLight,设置其Culling Mask为PostProcessing,这样在这个相机中只有PostProcessing图层的物体可见。创建RenderTexture
新建一个RenderTexture,命名为HightLightRt,将CameraHighLight的Target Texture设为HightLightRt。创建相机Camera2
新建一个相机Camera2,这个相机用于显示其他物体。合并灰度图
接下来将CameraHighLight和Camera2中画面转化为两张灰度图,再合并成一张图。合并的过程使用OnRenderImage函数,该函数中使用shader的片断着色器处理,取到两张图相同位置的像素后,谁的灰度值高就取谁的亮度。为了突出CameraHighLight的物体,取Camera2中像素时将适当缩小亮度值。创建C#脚本ThermalVision.cs
新建C#脚本ThermalVision.cs,将ThermalVision.cs挂载到Camera2。using UnityEngine; public class ThermalVision : MonoBehaviour { public bool IsInverse = false; public RenderTexture OtherTex; private Material material1; private Material material2; // Creates a private material used to the effect void Awake() { material1 = new Material(Shader.Find("Hidden/Thermal1")); material2 = new Material(Shader.Find("Hidden/Thermal2")); } // Postprocess the image void OnRenderImage(RenderTexture source, RenderTexture destination) { if (IsInverse) { material1.SetTexture("_OtherTex", OtherTex); Graphics.Blit(source, destination, material1); } else { material2.SetTexture("_OtherTex", OtherTex); Graphics.Blit(source, destination, material2); } } }创建shader
新建两个shader,分别为Thermal1、Thermal2,一个为白色模式,一个为黑色模式。Shader "Hidden/Thermal1" { Properties{ _MainTex("Base (RGB)", 2D) = "white" {} _OtherTex("Other (RGB)", 2D) = "white" {} } SubShader{ Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _MainTex; uniform sampler2D _OtherTex; float4 frag(v2f_img i) : COLOR { fixed4 renderTex = tex2D(_MainTex, i.uv); fixed4 OtherTex = tex2D(_OtherTex, i.uv); fixed gray1 = 0.2125 * renderTex.r + 0.7154 * renderTex.g + renderTex.b; fixed gray2 = 0.2125 * OtherTex.r + 0.7154 * OtherTex.g + OtherTex.b; fixed maxgr = gray1 * 0.1* step(gray2, gray1) + gray2 * step(gray1, gray2); //fixed maxgr = max(gray1, gray2); fixed3 grayColor = float3(maxgr, maxgr, maxgr); float4 result = renderTex; result.rgb = grayColor; return result; } ENDCG } } }Shader "Hidden/Thermal2" { Properties{ _MainTex("Base (RGB)", 2D) = "white" {} _OtherTex("Other (RGB)", 2D) = "white" {} } SubShader{ Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _MainTex; uniform sampler2D _OtherTex; float4 frag(v2f_img i) : COLOR { fixed4 renderTex = tex2D(_MainTex, i.uv); fixed4 OtherTex = tex2D(_OtherTex, i.uv); fixed gray1 = 0.2125 * renderTex.r + 0.7154 * renderTex.g + renderTex.b; fixed gray2 = 0.2125 * OtherTex.r + 0.7154 * OtherTex.g + OtherTex.b; fixed maxgr = gray1 * 0.5* step(gray2, gray1) + gray2 * step(gray1, gray2); fixed3 grayColor = float3(maxgr, maxgr, maxgr); float4 result = renderTex; result.rgb = float3(1- grayColor.r, 1 - grayColor.g, 1 - grayColor.b); return result; } ENDCG } } }
最终效果
热门推荐
【Block总结】ASSA,自适应稀疏自注意力,减少无关区域的噪声干扰
比较器电路详解:工作原理与灵敏度问题
宝妈失眠怎么办?帮助新手妈妈改善睡眠的有效方法推荐!
【白酒酿造】降低杂醇油含量的方法
自动驾驶技术的深度思考:安全与伦理的挑战
翅片管换热器如何防止结垢?
成吉思汗与元朝:开创者与继承者的关系探析
交流电相对于直流电的优势
通天教主都不敢妄为,三霄娘娘为何就敢摆下九曲黄河阵?犯下大忌
深度解析:中国房价未来走势及购房者指南
怎么制定有效的企业竞争战略分析框架?
磨刀五大指南:让厨刀保持最佳状态
安全员如何做到项目经理
中医界的双雄对决:倪海厦与王正龙的学术争锋
中国古代四大美男子的传奇故事
塔罗牌宝剑六 (6 of Swords)逆位的感情发展趋势
一英寸等于多少厘米?解密长度单位的秘密!
培养孩子的成长型思维,让孩子终生受益
张兰医生:眼科专家的精湛技艺与专业素养
十年最佳开局!跑赢美股,欧股这次能逆袭吗?
三国谋士排名:魏蜀吴群雄四方谋士比拼,最强的谋士天团是哪家?
如何彻底清洗洗衣机内的霉菌(简单而有效的清除方法及预防措施)
2024深圳公园文化季举办AI全场景应用专场 公园之城“AI”了 市民更爱了
狼犬是狼还是狗?它是最狼的狗,还是最狗的狼...
昙花的养殖方法和修剪
乔布斯的管理哲学:从专注到融合人文与科学
糖化血色素正常值是多少?糖化血色素偏高飲食和對照表
验房时发现房屋质量有问题该怎么办
十代思域如何查看电瓶电量
如何评估黄金市场的供需变化?这些变化如何影响价值波动?