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

Unity Shader 实现X光效果

Unity Shader 实现X光效果

  • Unity Shader 实现实物遮挡外轮廓发光效果
    • 第五人格
    • 黎明杀机
    • 火炬之光
  • 实现方案
  • 操作实现
  • 立体感优化
  • 总结
  • 源码

Unity Shader 实现实物遮挡外轮廓发光效果

之前看过《火炬之光》、《黎明杀机》、《第五人格》等不少的游戏里面人物被建筑物遮挡呈现出不同的效果,在这里我们就叫他X-Ray效果,也可以叫透视效果。

第五人格

第五人格

黎明杀机

黎明杀机

火炬之光

火炬之光

实现方案

  1. 采用Amplify Shader Editor1.6.1

  2. Fresnel Node
    利用光到达具有不同折射率的两种材质之前的界面时的行为,以及反射和折射的量。
    ReflectionCoefficient = Bias + Scale x (1 + N)

节点参数描述默认值
法向空间指定法向量所在的坐标空间
正切:法向量在切向空间坐标中
世界:法向量在世界空间坐标中
偏置定义了菲涅耳方程的偏置变量。仅当各输入端口未连接时才可见0
尺度定义了菲涅耳方程的尺度变量。仅当各输入端口未连接时才可见1
幂定定义了菲涅耳方程的幂定变量。仅当各输入端口未连接时才可见5
输入端口描述类型
要使用的法向量如果不连接,将使用表面世界法线float 3
偏置定义了菲涅耳方程的偏置变量float
尺度定义了菲涅耳方程的尺度变量float
定义了菲涅耳方程的幂变量float
  1. Swizzle Node
    允许重新组织和复制其输入组件。输入和输出可以是不同的类型。

在这里插入图片描述
4. Outline Node
围绕某个对象创建一个Outline。
在这里插入图片描述

操作实现

X-Ray

  1. 创建一个Shader
    (1)将Outline设置为Transparent(透明模式)
    (2)Cull Mode模式设置有三个选项off front back
    正常的我们使用一个front就可以 这样可以节省性能
    因为透明材质是从前向后渲染的,当我们选择front就不需要渲染物体的背面,降低了GPU的性能消耗

注意:如果要做物体之间的遮挡关系我们需要知道z-buffer,然而我们对z-buffer的调用就是通过ZTest和ZWrite来实现的。

这里我直接拿之前做的测试来说就不演示了
ZTest(深度测试)和ZWrite(深度写入)
a.深度测试通过,深度写入开启:写入深度缓冲区,写入颜色缓冲区;
b.深度测试通过,深度写入关闭:不写深度缓冲区,写入颜色缓冲区;
c.深度测试失败,深度写入开启:不写深度缓冲区,不写颜色缓冲区;
d.深度测试失败,深度写入关闭:不写深度缓冲区,不写颜色缓冲区;
所以直接的影响还是要看ZTest

在ZTest和ZWrite相同的情况下,就需要通过调整Geometry队列的大小来影响渲染的先后顺序,Gemometry大的先渲染,小的后渲染

ZTest Less(深度小于当前缓存则通过, ZTest Greater(深度大于当前缓存则通过)
ZTest LEqual(深度小于等于当前缓存则通过)
ZTest GEqual(深度大于等于当前缓存则通过)
ZTest Equal(深度等于当前缓存则通过)
ZTest NotEqual(深度不等于当前缓存则通过)
ZTest Always(不论如何都通过)

注意:
ZTest Off等同于ZTest Always,关闭深度测试等于完全通过。

(3)ZWrite(深度写入)
这里直接off就可以,不需要写入深度缓冲区
(4)ZTest(深度测试)
这里直接Always(永远通过)
在这里插入图片描述
此时创建一个材质球赋值刚才创建的Shader

发现已经有了X光的效果,但是有不足,没有立体感,我们在进行优化一下
在这里插入图片描述

立体感优化

改进方案:
将边缘至中心颜色淡化,看起来更加立体

注意:将Fresnel中的Normal Vector选项更改为自身,而不是世界(立体感)
在这里插入图片描述

这时在加入一个Lerp差值运算
将颜色和上图运算公式做插值运算
在这里插入图片描述
优化完成效果图
在这里插入图片描述

这时候发现还有一个问题,当我们调Alpha值时,冷色调和段色调是相反的比如上图所示红色alpha值在-0.93左右比较好,但是冷色调是在1~2之间比较好,我们需要把值控制在一个范围内,继续优化

  1. 这时候我们在Color的做差值运算的时候我们添加一个Swizzle 并将他的输出类型改为Float
    将端口改为alpha
  2. 在加入一个One Minus取反
  3. 在Alpha的地方取值Remap(将原有值重新赋值)

在这里插入图片描述
效果图如下:
调节Alpha的值区间为[0,1]
在这里插入图片描述

总结

1.我图中采用的模型是使用单模型多材质球,所以只展示了一个身体,单模型但材质直接赋值材质球就好,如果是单模型多材质的需要多创建几个材质球,因为每一部分的发现切图和Albedo图是不一样的。
2.这里就不展示Demo了,东西比较简单,感兴趣的可以研究一下这个插件Amplify Shader Editor,我用的是1.6.1版本
3.源码我也附上在下面

源码

Shader “ASE/Ray”
{
Properties
{
_ASEOutlineWidth( “Outline Width”, Float ) = 0
_Albedo(“Albedo”, 2D) = “white” {}
_Normalmap(“Normal map”, 2D) = “white” {}
_Color0(“Color 0”, Color) = (1,0,0,0)
_Alpha(“Alpha”, Float) = 0
_Bias(“Bias”, Range( 0 , 1)) = 0
_Scale(“Scale”, Range( 0 , 1)) = 0
_Power(“Power”, Range( 0 , 1)) = 0
[HideInInspector] _texcoord( “”, 2D ) = “white” {}
[HideInInspector] __dirty( “”, Int ) = 1
}

SubShader
{Tags{ "RenderType" = "Transparent"  "Queue" = "Transparent+0"}ZWrite OffZTest AlwaysCull FrontCGPROGRAM#pragma target 3.0#pragma surface outlineSurf Outline nofog alpha:fade  keepalpha noshadow noambient novertexlights nolightmap nodynlightmap nodirlightmap nometa noforwardadd vertex:outlineVertexDataFunc struct Input{float3 worldPos;float3 worldNormal;INTERNAL_DATA};uniform float4 _Color0;uniform float _Bias;uniform float _Scale;uniform float _Power;uniform float _Alpha;uniform half _ASEOutlineWidth;void outlineVertexDataFunc( inout appdata_full v, out Input o ){UNITY_INITIALIZE_OUTPUT( Input, o );v.vertex.xyz += ( v.normal * _ASEOutlineWidth );}inline half4 LightingOutline( SurfaceOutput s, half3 lightDir, half atten ) { return half4 ( 0,0,0, s.Alpha); }void outlineSurf( Input i, inout SurfaceOutput o ){float3 ase_worldPos = i.worldPos;float3 ase_worldViewDir = normalize( UnityWorldSpaceViewDir( ase_worldPos ) );float3 ase_worldNormal = WorldNormalVector( i, float3( 0, 0, 1 ) );float fresnelNdotV7 = dot( ase_worldNormal, ase_worldViewDir );float fresnelNode7 = ( _Bias + _Scale * pow( 1.0 - fresnelNdotV7, _Power ) );float lerpResult18 = lerp( ( 1.0 - (_Color0).a ) , fresnelNode7 , (-2.0 + (_Alpha - 0.0) * (0.0 - -2.0) / (1.0 - 0.0)));o.Emission = _Color0.rgb;o.Alpha = lerpResult18;o.Normal = float3(0,0,-1);}ENDCGTags{ "RenderType" = "Opaque"  "Queue" = "Geometry+1" }Cull BackZWrite OnZTest LEqualCGPROGRAM#pragma target 3.0#pragma surface surf Standard keepalpha addshadow fullforwardshadows vertex:vertexDataFunc struct Input{float2 uv_texcoord;};uniform sampler2D _Normalmap;uniform float4 _Normalmap_ST;uniform sampler2D _Albedo;uniform float4 _Albedo_ST;void vertexDataFunc( inout appdata_full v, out Input o ){UNITY_INITIALIZE_OUTPUT( Input, o );v.vertex.xyz += 0;}void surf( Input i , inout SurfaceOutputStandard o ){float2 uv_Normalmap = i.uv_texcoord * _Normalmap_ST.xy + _Normalmap_ST.zw;o.Normal = UnpackNormal( tex2D( _Normalmap, uv_Normalmap ) );float2 uv_Albedo = i.uv_texcoord * _Albedo_ST.xy + _Albedo_ST.zw;o.Albedo = tex2D( _Albedo, uv_Albedo ).rgb;o.Alpha = 1;}ENDCG
}
Fallback "Diffuse"
CustomEditor "ASEMaterialInspector"

}

相关文章:

Unity Shader 实现X光效果

Unity Shader 实现X光效果 Unity Shader 实现实物遮挡外轮廓发光效果第五人格黎明杀机火炬之光 实现方案操作实现立体感优化总结源码 Unity Shader 实现实物遮挡外轮廓发光效果 之前看过《火炬之光》、《黎明杀机》、《第五人格》等不少的游戏里面人物被建筑物遮挡呈现出不同的…...

Android Camera相关类功能整理

1.Camera Java相关类 代码目录:frameworks/base/core/java/android/hardware/camera2/ CameraManager:camera系统服务管理类,用于监测、获取特征值和连接Camera设备。 CameraManager.CameraManagerGlobal:全局camera Manager实例&#xff…...

3、Git分支操作与团队协作

Git分支操作 1.什么是分支2. 分支的好处3. 分支的操作3.1 查看分支3.2 创建分支3.3 切换分支3.4 修改分支3.5 合并分支3.6 产生和解决冲突 4. 创建分支和切换分支图解5. Git团队协作机制团队内协作跨团队协作 均在git bash中进行操作。事先建好本地工作库 1.什么是分支 在版本…...

Linux网卡配置

一、网卡配置 1、目录参数 /etc/syscofig/network-scripts/ifcfg-e*** /etc 目录时Linux系统的配置文件,有相对权限的用户能修改目录,但普通用户都可以访问。 sysconfig /etc/sysyconfig目录包含了Linux的系统配置文件 network-scripts network-scripts…...

wireshark access/trunk/hybrid报文分析

1,access接口 发送带vlan的报文 wireshark交换机配置 [Huawei-GigabitEthernet0/0/1] [Huawei-GigabitEthernet0/0/1]port link-type access [Huawei-GigabitEthernet0/0/1]port default vlan 100 [Huawei-GigabitEthernet0/0/2]port link-type access [Huawei-Gig…...

C++ Primer Plus----第十二章--类和动态内存分布

本章内容包括:对类成员使用动态内存分配;隐式和显式复制构造函数;隐式和显式重载赋值运算符;在构造函数中使用new所必须完成的工作;使用静态类成员;将定位new运算符用于对象;使用指向对象的指针…...

清理 Oracle Arch 目录中的日志文件

清理Oracle Arch目录中的文件需要遵循以下步骤: 1、登陆Oracle数据库服务器:确保你有权限访问Oracle数据库服务器,并且能够登录到服务器操作系统。 ssh 192.168.1.200 su - oracle2、启动RMAN(Recovery Manager)&…...

PicGo+GitHub搭建免费图床

PicGoGitHub搭建免费图床 步骤 1: 安装 PicGo步骤 2:创建图床仓库步骤 3: 配置 GitHub Token步骤 4: 配置 PicGo步骤 5: 上传图片步骤 6: 访问图片 使用 GitHub 作为图床的优势在于免费、稳定且具有版本控制功能,特别适合个人博客、小型项目等。PicGo作为一个开源的…...

免费在线客服软件推荐:经济实用的客户沟通解决方案

好用的在线客服软件是企业是必不可少的工具,他让企业流程更流畅高效,让客户服务更完善优质。市场上的在线客服软件有很多,说着免费使用的软件也不在少数。今天小编就来推荐一款免费在线客服软件。 不过,我们选择免费在线客服软件…...

leetcode344. 反转字符串

题目描述 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1: 输入:s ["h&quo…...

【js自定义鼠标样式】【js自定义鼠标动画】

文章目录 前言一、效果图二、实现步骤1. 去除原有鼠标样式2. 自定义鼠标样式3. 使用 总结 前言 自定义鼠标形状,自定义鼠标的动画,可以让我们的页面更加有设计感。 当前需求:吧鼠标自定义成一个正方形,鼠标的效果有:和…...

Linux开发工具——gdb篇

Linux下调试工具——gdb 文章目录 makefile自动化构建工具 gdb背景 gdb的使用 常用命令 总结 前言: 编写代码我们使用vim,编译代码我们使用gcc/g,但是我们,不能保证代码没问题,所以调试是必不可少的。与gcc/vim一样&…...

spring状态机

1、概述 Spring State Machine 是一个用于处理状态机逻辑的框架,它提供了一种简洁的方法来定义状 态、转换以及在状态变更时触发的动作。 概念 状态 ( State ) :一个状态机至少要包含两个状态。例如自动门的例子,有 …...

K8S异常处理

一、概述 1、k8s有时候会报错The connection to the server ip:6443 was refused - did you specify the right host or port ,本文档提供几种可能产生该报错的原因和排障思路。 二、发现问题 使用任意Kubectl 命令会报错:The connection to the serv…...

【挑战全网最易懂】深度强化学习 --- 零基础指南

深度强化学习介绍、概念 强化学习介绍离散场景,使用行为价值方法连续场景,使用概率分布方法实时反馈连续场景:使用概率分布 行为价值方法 强化学习六要素设计奖励函数设计评论家策略学习与优化 算法路径深度 Q 网络 DQN演员-评论家算法&…...

WPF RelativeSource

RelativeSource 类在 WPF 中提供了以下几种模式&#xff1a; RelativeSource Self&#xff1a;指定当前元素作为相对源。可以在当前元素的属性中绑定到自身的属性。 示例&#xff1a; <TextBlock Text"{Binding Text, RelativeSource{RelativeSource Self}}" /&…...

centos 安装 配置 zsh

centos 编译安装 zsh 和 配置 oh-my-zsh 下载 wget https://jaist.dl.sourceforge.net/project/zsh/zsh/5.9/zsh-5.9.tar.xz依赖 yum install ncurses-devel安装zsh 执行&#xff1a; tar -xvf zsh-5.9.tar.xz cd zsh-5.9 ./configure --prefix/usr/local/zsh5.9 make &am…...

git 常用基本命令, reset 回退撤销commit,解决gitignore无效,忽略记录或未记录远程仓库的文件,删除远程仓库文件

git 基本命令 reset 撤销commit https://blog.csdn.net/a704397849/article/details/135220091 idea 中 rest 撤销commit过程如下&#xff1a; Git -> Rest Head… 在To Commit中的HEAD后面加上^&#xff0c;点击Reset即可撤回最近一次的尚未push的commit Reset Type 有三…...

Vue Echarts 多折线图只有一条X轴(合并X轴数据并去重排序) - 附完整示例

echarts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&am…...

WPF+Halcon 培训项目实战(6):目标匹配助手

文章目录 前言相关链接项目专栏模板匹配助手简单使用金字塔级别参数自动选择应用插入代码 总结 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享&#xff0c;想要源码…...

Linux管理LVM逻辑卷

目录 一、LVM逻辑卷介绍 1. 概述 2. LVM基本术语 2.1 PV&#xff08;Physical Volume&#xff0c;物理卷&#xff09; 2.2 VG (Volume Group&#xff0c;卷组&#xff09; 2.3 LV (Logical Volume&#xff0c;逻辑卷&#xff09; 3. 常用的磁盘命令 4. 查看系统信息的命…...

vue如何实现局部刷新?

应用场景&#xff1a; 比如你要切换tap栏实现刷新下面form表单等&#xff0c;相当于刷新页面。 如何使用如下&#xff1a; <div v-if"isReloadData"> 比如你想刷新那个位置就把 v-if"isReloadData"写到那个标签上 </div> 在data中定义刷新标…...

C语言,指针链表详解解说及代码示例

C语言&#xff0c;指针链表详解解说及代码示例 指针链表是一种常用的数据结构&#xff0c;用于存储和组织数据。它由一系列节点组成&#xff0c;每个节点包含数据和一个指向下一个节点的指针。通过这种方式&#xff0c;可以动态地添加、删除和访问节点&#xff0c;实现灵活的数…...

6、LLaVA

简介 LLaVA官网 LLaVA使用Vicuna(LLaMA-2)作为LLM f ϕ ( ⋅ ) f_\phi() fϕ​(⋅)&#xff0c;使用预训练的CLIP图像编码器 ViT-L/14 g ( X v ) g(X_v) g(Xv​)。 输入图像 X v X_v Xv​&#xff0c;首先获取feature Z v g ( X v ) Z_vg(X_v) Zv​g(Xv​)。考虑到最后一…...

SpringMVC核心处理流程梳理

1、处理流程图展示 当我拿出这张图&#xff0c;阁下又该如何应对呢&#xff1f;执行流程是不是一目了然了。【记住一句话&#xff1a;所有的注解都只是一个标签或者标记&#xff0c;最终都是反射找到具体方法上面的注解标记&#xff0c;然后找到类、属性、方法扩展自己想要的功…...

go 语言程序设计第2章--程序结构

2.1 名称 如果一个实体在函数中声明&#xff0c;它只在函数局部有效。如果声明在函数外&#xff0c;它将对包里面所有源文件可见。 实体第一个字母的大小写决定其可见性是否跨包。如果名称以大写字母开头&#xff0c;它是导出的&#xff0c;意味着它对包外是可见和可访问的。包…...

JavaScript基础知识点总结:从零开始学习JavaScript(五)

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…...

Intel FPGA 技术开放日

概要 时间&#xff1a;2023.11.14 全天 &#xff08; 9:00 - 16: 20&#xff09; 地点&#xff1a;北京望京. 凯悦酒店 主题内容&#xff1a;分享交流了Intel FPGA 产品技术优势和落地实践方案。 会议的议程 开场致词&#xff1a; FPGA业务&#xff0c;是几年前intel收购而…...

分享72个Python爬虫源码总有一个是你想要的

分享72个Python爬虫源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1v2P4l5R6KT2Ul-oe2SF8cw?pwd6666 提取码&#xff1a;6666 项目名称 10 photo websites…...

Mybatis 动态 SQL - foreach

动态SQL的另一个常见需求是需要迭代一个集合&#xff0c;通常用于构建IN条件。例如&#xff1a; <select id"selectPostIn" resultType"domain.blog.Post">SELECT *FROM POST P<where><foreach item"item" index"index&quo…...

网站开发书/中国职业技能培训中心官网

文章目录一、新建一个自己的Git仓库二、将本地项目上传到自己的Git仓库中1. 快速步骤分解2. 图文步骤详解跟着文章一步一步来&#xff0c; 最后去你的码云仓库刷新一下就有项目内容了 一、新建一个自己的Git仓库 如果没有注册账号的朋友&#xff0c;可以先去注册一个Gitee的账…...

手机端的网站首页该怎么做/电脑培训学校哪家好

由于工作需要&#xff0c;需要搭建hadoopzookeeperhbasestormkafka集群准备了三台服务器&#xff08;一台8核32G内存300G硬盘充当master&#xff0c;一台8核16G内存300G硬盘充当slave01&#xff0c;一台816G500G硬盘充当slave02&#xff0c;并且都能上网&#xff09;&#xff0…...

网站开发需要英语/网络营销推广处点

第十一篇&#xff1a;REST调用 上篇写的是Ajax调用WCF&#xff0c;今天写一篇如何以REST方式调用WCF服务。不知道REST是什么的同学&#xff0c;可以去google一下。对某些类型的应用&#xff0c;REST还是相当不错的方式&#xff0c;所以专门写一篇来说明一下开发方法。 老规矩&a…...

网站建设专业术语/客户引流推广方案

MySQL5.7高可用MHAAtlas视频课程9 ?0 n% Y9 N1 X- D( p" N0 D" F7 A3 ?: z Q课程目标/ ~# K1 ?9 l2 m. P掌握企业MySQL常用高可用技术并且和Atlas读写分离结合使用0 u; X \6 p. s M D9 o) ~适用人群1 K& Q. Z7 I3 K5 |7 G8 hLinux运维、DBA、MySQL运维( [ …...

武汉网站建设易天时代/seo基础视频教程

现如今科技在高速发展我们迎来了新时代大数据时代为了让同学们更好的了解“大数据”我校商学院成立了大数据创新联盟社团现在和小编一起探课吧活动开始&#xff0c;刘超凡同学向同学介绍了大数据创新联盟社团的目的意义、组织形式、活动开展以及相关要求。并且明确指出大一上学…...

做网站外包的公司好干嘛/网站seo博客

1.对于大型的游戏产品都会有剧情, 其实剧情不仅仅是简单的过度演示&#xff0c;优秀的剧情可以是低操作高细节的内置"剧情小游戏"转载于:https://www.cnblogs.com/vilyLei/articles/4047592.html...