Unity中URP下实现能量罩(外发光)

文章目录


前言

能量罩外发光,效果主要是周围亮,中间透明的样子。这和菲涅尔效果刚好相反。所以,我们在这篇文章中,使用菲尼尔公式实现能量罩的外发光效果。

  • Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

一、实现菲涅尔效果

  • 核心公式: N ⃗ ⋅ V ⃗ \vec{N}·\vec{V} N V

1、求 N ⃗ \vec{N} N

  • 在应用程序传入顶点着色器中,接收模型本地空间法线

half3 normalOS : NORMAL;

  • 在顶点着色器传入片元着色器结构体,添加模型世界空间法线

half3 normalWS : TEXCOORD4;

  • 在顶点着色器,把法线从本地空间转化到世界空间

o.normalWS = TransformObjectToWorldNormal(v.normalOS);

  • 在片元着色器,对其归一化后得到 N ⃗ \vec{N} N

half3 N = normalize(i.normalWS);

2、求 V ⃗ \vec{V} V

  • 在 顶点着色器传入片元着色器结构体增加模型顶点世界空间

float3 positionWS : TEXCOORD2;

  • 在顶点着色器,把模型顶点本地空间坐标 转化为 模型顶点世界空间坐标

o.positionWS = TransformObjectToWorld(v.positionOS);

  • 在片元着色器,用摄像机世界空间坐标减去模型顶点世界空间坐标,归一化后得到 V ⃗ \vec{V} V

half3 V = normalize(_WorldSpaceCameraPos - i.positionWS);

3、得出菲涅尔效果

half NdotV = dot(N,V);

在这里插入图片描述

4、得出菲涅尔相反效果

  • 在属性面板定义 float 用于控制菲涅尔强弱

_FresnelIntensity(“FresnelIntensity”,Range(1,15)) = 1.0

  • 使用指数函数调节菲涅尔效果,并且限制 N ⃗ ⋅ V ⃗ ≥ 0 \vec{N}·\vec{V} \geq0 N V 0

half3 fresnel = pow(max(0,1 - NdotV),_FresnelIntensity);

在这里插入图片描述

5、增加菲涅尔颜色

  • 在属性面板增加Color控制菲涅尔颜色

_FresnelColor(“FresnelColor”,Color) = (0,0,0,0)

  • 在片元着色器,与菲涅尔相反效果相乘

fresnel *= _FresnelColor;

在这里插入图片描述


二、能量罩 交接处高亮 和 外发光效果结合

1、修改混合模式,使能量罩透明

Blend One One

在这里插入图片描述

2、限制 0 ≤ H i g h L i g h t C o l o r ≤ 1 0\leq HighLightColor\leq1 0HighLightColor1 和菲涅尔相加输出

return saturate(highLight)+fresnel;

请添加图片描述

三、测试代码

Shader "MyShader/URP/P4_3_4"
{Properties {[Header(HighLight)]_HighLightColor("HighLightColor",Color) = (0,0,0,0)_HighLightFade("HighLight",Float) = 1.0[Header(Fresnel)]_FresnelIntensity("FresnelIntensity",Range(1,15)) = 1.0_FresnelColor("FresnelColor",Color) = (0,0,0,0)}SubShader{Tags{//告诉引擎,该Shader只用于 URP 渲染管线"RenderPipeline"="UniversalPipeline"//渲染类型"RenderType"="Transparent"//渲染队列"Queue"="Transparent"}Pass{Blend One OneZWrite OffName "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;half _FresnelIntensity;half4 _FresnelColor;CBUFFER_ENDTEXTURE2D(_CameraDepthTexture);SAMPLER(sampler_CameraDepthTexture);TEXTURE2D(_CameraOpaqueTexture);SAMPLER(sampler_CameraOpaqueTexture);//struct appdata//顶点着色器的输入struct Attributes{float3 positionOS : POSITION;float2 uv : TEXCOORD0;half3 normalOS : NORMAL;};//struct v2f//片元着色器的输入struct Varyings{float4 positionCS : SV_POSITION;float2 uv : TEXCOORD0;float4 screenPos : TEXCOORD1;float3 positionWS : TEXCOORD2;float3 positionVS : TEXCOORD3;half3 normalWS : TEXCOORD4;};//v2f vert(Attributes v)//顶点着色器Varyings vert(Attributes v){Varyings o = (Varyings)0;o.positionWS = TransformObjectToWorld(v.positionOS);o.positionVS = TransformWorldToView(o.positionWS);o.positionCS = TransformWViewToHClip(o.positionVS);o.screenPos = ComputeScreenPos(o.positionCS);o.normalWS = TransformObjectToWorldNormal(v.normalOS);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;float4 opaqueMap = SAMPLE_TEXTURE2D(_CameraOpaqueTexture,sampler_CameraOpaqueTexture,uv);//fresnel外发光//pow(max(0,dot(N,V)),Intensity)half3 N = normalize(i.normalWS);half3 V = normalize(_WorldSpaceCameraPos - i.positionWS);half NdotV = dot(N,V);half4 fresnel = pow(max(0,1 - NdotV),_FresnelIntensity);fresnel *= _FresnelColor;return saturate(highLight)+fresnel;}ENDHLSL}}
}

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

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

相关文章

韵达快递物流查询,批量复制查询好的快递物流信息

在网购成为日常的今天,每一条快递物流信息都牵动着我们的心。如何快速、准确地掌握这些信息,成为了一个迫切的需求。今天,就让我为大家介绍一款神奇的软件——快递批量查询高手,助你轻松查获和管理快递物流信息。 所需工具&#…

C语言理解

目录 计算机语言算法C项目创建C程序框架经典实例 计算机语言 程序是用特殊的编程语言(这里是C语言)写出来表达如何解决问题的不是用编程语言来和计算机交谈,而是描述要求它如何做事情的过程或方法程序是问题的载体,程序的执行就是…

羊奶加红枣,女性必备的加法!

羊奶加红枣,女性必备的加法! 在当今社会,女性健康备受关注。而羊奶和红枣作为常见的食材,以其独特的营养价值备受追捧。不少人认为,羊奶里面加红枣对女生有很大的帮助。那么,到底羊奶加红枣对女性健康有哪…

GitHub pull request(傻瓜式入门版)

基础入门版 pull request一、fork项目二、clone代码到本地三、进入到克隆的项目目录下四、列出所有分支五、创建一个本地分支,并追踪远程项目分支六、查看当前分支七、与远程仓库建立连接八、与上游仓库建立连接八、同步最新代码九、修改代码并提交十、提交pr pull …

推荐几本学习Python的书籍

我推荐的学习Python的书籍 入门读物 《Python基础教程》(Beginning Python From Novice to Professional)《Python学习手册》(Learning Python)《Python编程》(Programming Python)《Python Cookbook》《…

苍穹外卖Day01——解决总结1中存在的问题

前序章节: 苍穹外卖Day01——总结1 解决总结1中存在的问题 1. 什么是JWT2. POJO、Entity、VO、DTO3. Nginx(反向代理)4. Data注解 1. 什么是JWT JWT(JSON Web Token)是一种用于在网络应用间传递信息的开放标准&#…

重学Java 2.Java入门程序

不破不立 ——24.1.11 1.开发三步骤 1.编写: a.创建一个文本文档 b.注意:将文件的后缀名显示出来 显示扩展名:点击查看->点击文件扩展名 2.编译: a.命令:javac java文件名.java b.注意:javac会将java文…

怎么使用好爬虫IP代理?爬虫代理IP有哪些使用技巧?

在互联网时代,爬虫技术被广泛应用于数据采集和处理。然而,在使用爬虫技术的过程中,经常会遇到IP被封禁的问题,这给数据采集工作带来了很大的困扰。因此,使用爬虫IP代理成为了解决这个问题的有效方法。本文将介绍如何使…

android 9 reboot流程

机器出现开机 自动进入fastboot模式。可能是init 那个进程挂了 然后调用了 RebootSystem(ANDROID_RB_RESTART2, “bootloader”); 函数进入重启流程,然后重启后进入fastboot 浅读一下reboot流程和怎么进入的fastboot 比如说是那个进程挂了调用了这个函数&#xff0c…

nuxt pm2使用、启动、问题解决方案

pm2简介 pm2是一个进程管理工具,可以用它来管理node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能,在前端和nodejs的世界中用的很多 pm2安装 安装pm2: $ npm install -g pm2查看pm2的安装…

哪种小型洗衣机好用?高性价比的小型洗衣机推荐

大型洗衣机作为家居必备小家电,对生活品质的提升十分显著,在很多人的认知中,这种大型洗衣机主要是用来清洁大件的衣服和外套的,不方便将内衣裤都放入到里面,内衣裤的材质和尺寸都是比较特殊,若是直接将其放…

多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测

多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测 目录 多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现RIME-HKELM霜冰算法优化混合核极限学…

ORACLE RAC DG文件路径错乱解决办法

最近接手了一个客户的RAC-RAC dg环境的维护,登录上去之后发现dg延迟了8天,由于主库的空间非常紧张,归档日志早就删除了,所以准备使用rman基于scn点的备份恢复的方案恢复dg同步 在备份完成之后,使用新的控制文件进行数据恢复的时候报错datafile 43 not found: 检查了一下发现当…

架构(1)

目录 1.如何理解架构的演进? 2.如何理解架构的服务化趋势? 3.架构中有哪些技术点? 4.谈谈架构中的缓存应用? 5.在开发中缓存具体如何实现? 1.如何理解架构的演进? 初始阶段的网站架构应用服务和数据服…

使用kennycason.kumo.WordCloud For JAVA 制作词云图

官网&#xff1a;https://kennycason.com/posts/2014-07-03-kumo-wordcloud.html 一&#xff1a;添加POM文件 <!-- 词云 --><dependency><groupId>com.kennycason</groupId><artifactId>kumo-core</artifactId><version>1.27<…

开启Android学习之旅-2-架构组件实现数据列表及添加(kotlin)

Android Jetpack 体验-官方codelab 1. 实现功能 使用 Jetpack 架构组件 Room、ViewModel 和 LiveData 设计应用&#xff1b;从sqlite获取、保存、删除数据&#xff1b;sqlite数据预填充功能&#xff1b;使用 RecyclerView 展示数据列表&#xff1b; 2. 使用架构组件 架构组…

06、Kafka ------ 各个功能的作用解释(ISR 同步副本、非同步副本、自动创建主题、修改主题、删除主题)

目录 CMAK 各个功能的作用解释★ ISR副本 (同步副本&#xff09;★ 非同步副本★ 自动创建主题★ 修改主题★ 删除主题 CMAK 各个功能的作用解释 ★ ISR副本 (同步副本&#xff09; 简单来说 &#xff0c;ISR 副本 就是 Kafka 认为与 领导者副本 同步的副本。 ISR&#xff0…

从0开始python学习-47.pytest框架之解决Template替换无法进行二次处理的问题之热加载

问题&#xff1a;当参数为动态参数时&#xff0c;Template替换无法进行二次处理 解决方案&#xff1a;通过热加载来进行替换 热加载原理&#xff1a;在代码运行的过程中动态的调用python中的方法达到获得动态参数 可以进行热加载的情况&#xff1a;yaml文件&#xff0c;随机…

Docker 发布自定义镜像到公共仓库

Docker 发布自定义镜像到公共仓库 引言 Docker 是一种轻量级、便携式的容器化技术&#xff0c;可以使应用程序在不同环境中更加可移植。在本文中&#xff0c;我们将学习如何使用 Docker 从公共仓库拉取 Nginx 镜像&#xff0c;定制该镜像&#xff0c;添加自定义配置文件&…

在docker上运行LCM

目录 1.加载镜像并进入容器 2.安装依赖 3.在docker外部git-clone lcm 4.将get-clone的lcm复制到容器中 5.编译库 6.将可执行文件复制到容器中 7.进入可执行文件 8.编译可执行文件 9.再开一个终端运行程序 10.将以上容器打成镜像并导出 1.加载镜像并进入容器 sudo do…