Unity中URP下实现能量罩(交接处高亮)

文章目录

  • 前言
  • 一、交接处高亮 原理
    • 1、 我们先用一个球作为能量罩、一个Cube 和 一个 椭球 作为与能量罩交接的物体
    • 2、 这是我们目前场景的深度图
    • 3、使能量罩为 半透明渲染队列 且 关闭深度写入 不渲染深度图
  • 二、交接处高亮 实现
    • 1、得到深度图
    • 2、在片元着色器中,对深度图进行纹理采样
    • 3、得到深度图 观察空间下的Z值
    • 4、得到 深度图 观察空间Z值 和 能量罩观察空间Z值 的 差值
    • 5、用1 - depth得到反色
    • 6、在属性面板定义一个参数用于控制高亮范围
    • 6、在属性面板定义一个Color用于控制高亮颜色
    • 请添加图片描述
  • 三、测试代码


前言

在之前的文章中,我们实现了 深度图 和 抓屏 的使用。我们用这些功能来实现一下能量罩效果。

  • Unity中URP下使用屏幕坐标采样深度图

  • Unity中URP下抓屏的 开启 和 使用


一、交接处高亮 原理

1、 我们先用一个球作为能量罩、一个Cube 和 一个 椭球 作为与能量罩交接的物体

在这里插入图片描述

2、 这是我们目前场景的深度图

在这里插入图片描述

  • 我们要实现交接处高亮,使用交接外面的部分,是实现不了的
  • 因为,用深度图观察空间下的Z值 和 物体能量罩的观察空间Z轴,得到外面的部分 和 之前的是一致的
  • 所以,我们得用 深度图 和 能量罩的观察空间Z轴,来得到 交接处高亮

3、使能量罩为 半透明渲染队列 且 关闭深度写入 不渲染深度图

  • 这样能量罩就不被深度图渲染了
    在这里插入图片描述
  • 我们就可以使用 深度图观察空间下的Z值 和 能量罩的观察空间Z值 得到 交接的内部区域了

二、交接处高亮 实现

1、得到深度图

  • 申明 深度图 纹理 和 深度图采样器

TEXTURE2D(_CameraDepthTexture);SAMPLER(sampler_CameraDepthTexture);

2、在片元着色器中,对深度图进行纹理采样

float2 uv = i.positionCS.xy/ _ScreenParams.xy;
float4 cameraDepthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,uv);

3、得到深度图 观察空间下的Z值

float depthTex = LinearEyeDepth(cameraDepthTex,_ZBufferParams);

4、得到 深度图 观察空间Z值 和 能量罩观察空间Z值 的 差值

  • 由于观察空间是右手坐标系。所以该Z值是负值。
  • 能量罩观察空间Z值,需要在顶点着色器中提前计算好,从顶点着色器传入片元着色器
  • 差值 = 用深度图观察空间Z值 + 能量罩观察空间Z值

float4 depth = depthTex + i.positionVS.z;

在这里插入图片描述

5、用1 - depth得到反色

float4 highLight = 1 - depth;

6、在属性面板定义一个参数用于控制高亮范围

  • 相乘节省性能

highLight *= _HighLightFade;

  • 指数效果更佳

highLight = pow(highLight,_HighLightFade);

请添加图片描述

6、在属性面板定义一个Color用于控制高亮颜色

highLight *= _HighLightColor;

请添加图片描述

三、测试代码

Shader "MyShader/URP/P4_3"
{Properties {_HighLightColor("HighLightColor",Color) = (0,0,0,0)_HighLightFade("HighLight",Float) = 1.0}SubShader{Tags{//告诉引擎,该Shader只用于 URP 渲染管线"RenderPipeline"="UniversalPipeline"//渲染类型"RenderType"="Transparent"//渲染队列"Queue"="Transparent"}//Blend One OneZWrite OffPass{Name "Unlit"HLSLPROGRAM#pragma vertex vert#pragma fragment frag// Pragmas#pragma target 2.0// Includes#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"CBUFFER_START(UnityPerMaterial)half4 _HighLightColor;half _HighLightFade;CBUFFER_ENDTEXTURE2D(_CameraDepthTexture);SAMPLER(sampler_CameraDepthTexture);//struct appdata//顶点着色器的输入struct Attributes{float3 positionOS : POSITION;float2 uv : TEXCOORD0;};//struct v2f//片元着色器的输入struct Varyings{float4 positionCS : SV_POSITION;float2 uv : TEXCOORD0;float4 screenPos : TEXCOORD1;float3 positionVS : TEXCOORD2;};//v2f vert(Attributes v)//顶点着色器Varyings vert(Attributes v){Varyings o = (Varyings)0;float3 positionWS = TransformObjectToWorld(v.positionOS);o.positionVS = TransformWorldToView(positionWS);o.positionCS = TransformWViewToHClip(o.positionVS);o.screenPos = ComputeScreenPos(o.positionCS);return o;}//fixed4 frag(v2f i) : SV_TARGET//片元着色器half4 frag(Varyings i) : SV_TARGET{//深度图//float2 uv = i.screenPos.xy / i.screenPos.w;float2 uv = i.positionCS.xy/ _ScreenParams.xy;float4 cameraDepthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,uv);float depthTex = LinearEyeDepth(cameraDepthTex,_ZBufferParams);float depth = depthTex + i.positionVS.z;float4 highLight = 1 - depth;highLight = pow(highLight,_HighLightFade);highLight *= _HighLightColor;return highLight;}ENDHLSL}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/338275.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 自定义仿word表单录入之单选按钮组件

因项目需要&#xff0c;要实现仿word方式录入数据&#xff0c;要实现鼠标经过时才显示编辑组件&#xff0c;预览及离开后则显示具体的文字。 鼠标经过时显示 正常显示及离开时显示 组件代码 <template ><div class"pager-input flex border-box full-width fl…

Linux 简述

文章目录 1. 背景2. Linux 环境搭建2.1 环境搭建方式2.2 使用云服务器2.3 使用终端软件连接到 Linux 3. Linux 常用命令3.1 ls3.2 cd3.3 pwd3.4 touch3.5 cat3.6 echo3.7 vim3.8 mkdir3.9 rm3.10 mv3.11 cp3.12 grep3.13 ps3.14 netstat 4. 搭建 Java 部署环境4.1 jdk4.2 tomca…

Transformer架构的局限已凸显,被取代还有多久?

江山代有才人出&#xff0c;各领风骚数百年。这句话无论是放在古往今来的人类身上&#xff0c;还是放在当今人工智能领域的大模型之上&#xff0c;都是最贴切不过的。无论是一个时代的伟人&#xff0c;还是统治一个领域的技术&#xff0c;最终都会有新的挑战者将其替代。Transf…

idea2023连接gitee远程仓库

目录 1.在gitee创建远程仓库 2.在Idea里配置git 3.初始化本地仓库 4.连接gitee远程仓库 5. 提交推送至远程仓库 注意&#xff1a;提前下好git工具、idea2023&#xff0c;注册gitee账号&#xff0c;本文不介绍 1.在gitee创建远程仓库 创建好后&#xff0c;复制远程仓库地址 2.…

Spark SQL基础

一.Pandas简介 1、基本介绍 Pandas是Python的一个第三方包&#xff0c;也是商业和工程领域最流行的结构化数据工具集&#xff0c;用于数据清洗、处理以及分析 Pandas和Spark SQL中很多功能都类似&#xff0c;甚至使用方法都是相同的 Pandas适用场景 Pandas用于处理单机数据 …

blob分析找出感兴趣区域,求其轮廓再用差分找缺陷

*关闭程序计数器,图形变量,窗口图形更新 dev_update_off() * Image Acquisition 01: Code generated by Image Acquisition 01 ImageFiles : [] ImageFiles[0] : 1.bmp ImageFiles[1] : 2.bmp for Index : 0 to |ImageFiles| - 1 by 1*读取一张图像read_image (Image, ImageFil…

mac录屏软件有哪些?分享5个实用软件

mac录屏软件有哪些&#xff1f;随着Mac电脑在创意和专业领域的使用日益普及&#xff0c;越来越多的用户需要录制屏幕内容以进行分享、演示或后期编辑。本文将为您介绍几款知名的Mac录屏软件&#xff0c;让您轻松实现屏幕录制的需求。 1.迅捷屏幕录像工具 这是一款功能强大的屏…

【Xilinx FPGA】异步 FIFO 的复位

FIFO&#xff08;First-In-First-Out&#xff0c;先入先出&#xff09;是一种的存储器类型&#xff0c;在 FPGA 开发中通常用于数据缓存、位宽转换或者跨时钟域&#xff08;多 bit 数据流&#xff09;。在使用异步 FIFO 时&#xff0c;应注意复位信号是否遵循相关要求和规范&am…

【设计模式-02】Strategy策略模式及应用场景

一、参考资料 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

水和冰一起进微波炉会怎样?不会还有人不知道吧

水和冰一起放到微波炉里加热 3 分钟&#xff0c;水已经冒烟的情况下&#xff0c;冰块会化掉吗&#xff1f; 事实上并不会。 不信&#xff0c;看一下这个视频—— 这个博主把一杯水和一杯冰放到微波炉里同时加热3分钟&#xff0c;结果水已经开始汽化了&#xff0c;冰还是冰。 这…

React入门 - 06(TodoList 列表数据的新增和删除)

本章内容 目录 一、实践一下 React 的列表渲染二、TodoList 新增功能三、列表循环的 key四、删除 上一节内容我们完成了输入框中可以自由输入内容&#xff0c;这一节我们继续 TodoList功能的完善&#xff1a;列表数据的新增和删除。 在开始之前&#xff0c;我们先介绍一下 Re…

LeetCode 145. 二叉树的后序遍历

145. 二叉树的后序遍历 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&…