Unity Shader 实现X光效果
Unity Shader 实现X光效果
- Unity Shader 实现实物遮挡外轮廓发光效果
- 第五人格
- 黎明杀机
- 火炬之光
- 实现方案
- 操作实现
- 立体感优化
- 总结
- 源码
Unity Shader 实现实物遮挡外轮廓发光效果
之前看过《火炬之光》、《黎明杀机》、《第五人格》等不少的游戏里面人物被建筑物遮挡呈现出不同的效果,在这里我们就叫他X-Ray效果,也可以叫透视效果。
第五人格

黎明杀机

火炬之光

实现方案
-
采用Amplify Shader Editor1.6.1
-
Fresnel Node
利用光到达具有不同折射率的两种材质之前的界面时的行为,以及反射和折射的量。
ReflectionCoefficient = Bias + Scale x (1 + N)
| 节点参数 | 描述 | 默认值 |
|---|---|---|
| 法向空间 | 指定法向量所在的坐标空间 | 切 |
| 正切:法向量在切向空间坐标中 | ||
| 世界:法向量在世界空间坐标中 | ||
| 偏置 | 定义了菲涅耳方程的偏置变量。仅当各输入端口未连接时才可见 | 0 |
| 尺度 | 定义了菲涅耳方程的尺度变量。仅当各输入端口未连接时才可见 | 1 |
| 幂定 | 定义了菲涅耳方程的幂定变量。仅当各输入端口未连接时才可见 | 5 |
| 输入端口 | 描述 | 类型 |
|---|---|---|
| 要使用的法向量 | 如果不连接,将使用表面世界法线 | float 3 |
| 偏置 | 定义了菲涅耳方程的偏置变量 | float |
| 尺度 | 定义了菲涅耳方程的尺度变量 | float |
| 幂 | 定义了菲涅耳方程的幂变量 | float |
- Swizzle Node
允许重新组织和复制其输入组件。输入和输出可以是不同的类型。

4. Outline Node
围绕某个对象创建一个Outline。

操作实现
X-Ray
- 创建一个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之间比较好,我们需要把值控制在一个范围内,继续优化
- 这时候我们在Color的做差值运算的时候我们添加一个Swizzle 并将他的输出类型改为Float
将端口改为alpha - 在加入一个One Minus取反
- 在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实例ÿ…...
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 中提供了以下几种模式: RelativeSource Self:指定当前元素作为相对源。可以在当前元素的属性中绑定到自身的属性。 示例: <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 执行: 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过程如下: Git -> Rest Head… 在To Commit中的HEAD后面加上^,点击Reset即可撤回最近一次的尚未push的commit Reset Type 有三…...
Vue Echarts 多折线图只有一条X轴(合并X轴数据并去重排序) - 附完整示例
echarts:一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档:Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&am…...
WPF+Halcon 培训项目实战(6):目标匹配助手
文章目录 前言相关链接项目专栏模板匹配助手简单使用金字塔级别参数自动选择应用插入代码 总结 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
