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 One
        ZWrite Off
        Pass
        {
            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_END

            
            TEXTURE2D(_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
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重新认识Elasticsearch-一体化矢量搜索引擎

前言 2023 哪个网络词最热?我投“生成式人工智能”一票。过去一年大家都在拥抱大模型,所有的行业都在做自己的大模型。就像冬日里不来件美拉德色系的服饰就会跟不上时代一样。这不前段时间接入JES,用上好久为碰的RestHighLevelClient包。心血…

静态网页设计实践(HTML+CSS)

一、前端程序员必会三大编程语言 (一)HTML(.html/.htm) 超文本标记语言(HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、Ja…

YOLOv8改进 | 二次创新篇 | 结合iRMB和EMA形成全新的iEMA机制(全网独家创新)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,为什么这么说,从去年的三月份开始对于图像领域的论文发表其实是变难的了,在那之前大家可能搭搭积木的情况下就可以简单的发表一篇论文,但是从去年开始单纯的搭积木其实发表论…

JWT的初级认识

文章目录 一.什么是JWT二.JWT能够做什么1.授权2.信息交换 三.为什么我们使用JWT传统的基于session的认证流程基于JWT认证1.认证流程2.jwt优势 四.JWT的结构是什么Header的组成4.2 Header4.3 Payload4.4 Signature签名目的 五.使用JWT5.1 引入JWT依赖5.2 生成token5.3 根据令牌和…

vue element-ui的table列表中展示缩略图片效果实例

这篇文章主要给大家介绍了关于vue element-ui的table列表中展示多张图片(可放大)效果的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下 一、效果图 二、代码部分 1、原理 使用 <el-table-column> 和 <el-image> 组件来在表格中插入缩略图 2、te…

回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SO-LSTM蛇群算法优化…

py的循环语句(for和while)

前言&#xff1a;本章节和友友们探讨一下py的循环语句&#xff0c;主播觉得稍微有点难主要是太浑了&#xff0c;但是会尽量描述清楚&#xff0c;OK上车&#xff01;&#xff08;本章节有节目效果&#xff09; 目录 一.while循环的基本使用 1.1关于while循环 1.2举例 1.31-1…

TensorFlow相关组件的安装

安装Anaconda3 安装Anaconda3的时候可以安装在任意磁盘中&#xff0c;在勾选path的时候全部勾选即可。更换Anaconda3的下载源为清华大学源&#xff0c;在此期间不要打开Anaconda3&#xff0c;在cmd中依次输入以下即可&#xff1a; conda config --add channels https://mirro…

【JaveWeb教程】(17) MySQL数据库开发之 MySQL简介、安装、数据类型、SQL通用语法 详细代码示例讲解

目录 前言1. MySQL概述1.1 安装1.1.1 版本1.1.2 安装1.1.3 连接1.1.4 企业使用方式(了解) 1.2 数据模型1.3 SQL简介1.3.1 SQL通用语法1.3.2 分类 前言 在我们讲解SpringBootWeb基础知识(请求响应案例)的时候&#xff0c;我们讲到在web开发中&#xff0c;为了应用程序职责单一&…

搜索与图论第一期 DFS(深度优先搜索)

前言 DFS这部分难度不大&#xff0c;大家应该完全掌握&#xff01;&#xff01;&#xff01; 一、DFS的基本内容 内容&#xff1a; 深度优先遍历图的方法是&#xff0c;从图中某顶点v出发&#xff1a; &#xff08;1&#xff09;访问顶点v&#xff1b; &#xff08;2&#…

Element Plus 离线手册 下载

Element Plus (Vue3) 离线手册&#xff0c;解压就能用&#xff0c;双击运行&#xff0c;浏览器访问 http://localhost:7011 获取方式&#xff1a;原文关注微信公众号&#xff0c;回复消息&#xff1a;7011ELP Element Plus 离线手册 下载Vue3 Element Plus 离线手册 离线文档 …

【教学类-45-05】X-Y之间的三连加减题混合 (横向排列)(44格:11题“++ ”11题“--”11题“ +-”11题“ -+” )

作品展示&#xff1a; 背景需求&#xff1a; 把以下四款3连题 混在一起&#xff0c;每种题目随机抽取11题&#xff0c;一共44格 【教学类-45-02】X-Y之间的“三连减“题(a-b-c)-CSDN博客文章浏览阅读465次&#xff0c;点赞15次&#xff0c;收藏7次。【教学类-45-02】X-Y之间的…

【算法】最佳牛围栏(二分,前缀和,双指针)

题目 农夫约翰的农场由 N 块田地组成&#xff0c;每块地里都有一定数量的牛&#xff0c;其数量不会少于 1 头&#xff0c;也不会超过 2000 头。 约翰希望用围栏将一部分连续的田地围起来&#xff0c;并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。 围起区域内…

Apache ActiveMQ RCE CNVD-2023-69477 CVE-2023-46604

漏洞简介 Apache ActiveMQ官方发布新版本&#xff0c;修复了一个远程代码执行漏洞&#xff0c;攻击者可构造恶意请求通过Apache ActiveMQ的61616端口发送恶意数据导致远程代码执行&#xff0c;从而完全控制Apache ActiveMQ服务器。 影响版本 Apache ActiveMQ 5.18.0 before …

java基础之Java8新特性-Optional

目录 1.简介 2.Optional类常用方法 3.示例代码 4.示例代码仓库地址 1.简介 Java 8引入了一个重要的新特性&#xff0c;即Optional类。Optional类是为了解决空指针异常而设计的。 在Java中&#xff0c;当我们尝试访问一个空对象的属性或调用其方法时&#xff0c;很容易抛出…

【sklearn练习】模型评估

一、交叉验证 cross_val_score 的使用 1、不用交叉验证的情况&#xff1a; from __future__ import print_function from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifieriris…

centos7下升级nginx1.8.0版本到nginx1.25.3版本

1、指定目录下载安装包 wget http://nginx.org/download/nginx-1.25.3.tar.gz 2、重命名老版本nginx目录 cd /usr/local/ mv nginx nginx_1.8.0 3、解压更新版本的压缩包 tar -zxvf nginx-1.25.3.tar.gz 4、进入nginx安装包目录下执行如下命令检测系统环境 --with-stream: 添…

Citrix思杰虚拟桌面离场,国产云桌面是否应继续对接微软Windows AD域?

2023年&#xff0c;12月3日&#xff0c;Citrix&#xff08;思杰&#xff09;全面退出中国市场。Citrix进入中国市场时&#xff0c;定位是大客户、高价值企业&#xff0c;客户群集中在国企、大型制造业、外资、金融等中大型企业&#xff0c;例如华为、中国移动、平安银行、建设银…

【Python】编程练习的解密与实战(二)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Python | 编程解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1fa90;1. 初识Python …

【IC设计】ICer‘s 乾坤大挪移——FSM状态机

目录 理论解读写几段式状态机&#xff1f; 设计实战两种state的FSM&#xff08;异步复位&#xff09; 理论解读 写几段式状态机&#xff1f; 设计实战 两种state的FSM&#xff08;异步复位&#xff09; 实现下图所示的摩尔状态机&#xff0c;复位为异步复位。 代码实现&am…