Unity Shader 实现X光效果

news2024/11/28 18:53:59

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 Off
	ZTest Always
	Cull Front
	CGPROGRAM
	#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);
	}
	ENDCG
	

	Tags{ "RenderType" = "Opaque"  "Queue" = "Geometry+1" }
	Cull Back
	ZWrite On
	ZTest LEqual
	CGPROGRAM
	#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"

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpingBoot的项目实战--模拟电商【2.登录】

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.功能需求 二.代码编写 …

3D展2D数学原理

今年早些时候,我为 MAKE 杂志写了一篇教程,介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理,并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub,但我在这里编写了对使这一…

新版ONENET的物联网环境调节系统(esp32+onenet+微信小程序)

新版ONENET的物联网环境调节系统(esp32onenet微信小程序) 好久没用onenet突然发现它大更新了,现在都是使用新版的物联网开放平台,只有老用户还有老版的多协议接入,新用户是没有的,所以我顺便更新一下新的开…

百度CTO王海峰:文心一言用户规模破1亿

“文心一言用户规模突破1亿。”12月28日,百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届WAVE SUMMIT深度学习开发者大会上宣布。会上,王海峰以《文心加飞桨,翩然赴星河》为题作了主旨演讲,分享了飞桨和文…

微软为 Android 用户推出了人工智能助手 Copilot 应用程序

微软为 Android 用户推出了人工智能助手 Copilot 应用程序 - 与 ChatGPT 类似,它包括聊天机器人功能和 DALL-E 3 图像生成 - 该应用程序包括免费访问 OpenAI 的 GPT-4 模型,这是 ChatGPT 中的付费功能 - 发布微软将 Bing Chat 更名为 Copilot 您是否尝试…

Linux 线程概念

文章目录 前言线程的概念线程的操作操作的原理补充与说明 前言 ① 函数的具体说明被放在补充与说明部分 ② 只说些基础概念和函数使用 线程的概念 网络回答:Linux 线程是指在 Linux 操作系统中创建和管理的轻量级执行单元。线程是进程的一部分,与进程…

易趋产品升级(EasyTrack 11_V1.3) | 集成飞书、WPS、个性化设置,增强团队协作和用户体验

企业在项目管理过程中,经常会遇到项目信息同步不及时、沟通障碍以及管理软件使用不便捷等难题,导致团队协作效率低下。这种情况下,如果使用了多个办公软件(如:钉钉、企业微信、项目管理软件等),…

【DC-DC】这是一款半亮 高亮 瀑闪的LED降压恒流刹车灯线路图

1产品描述 AP2402 是一款 PWM 工作模式,高效率、外围简单、内置功率管,适用于 5-100V输入的高精度降压 LED 恒流驱动芯片。输出功率可达 15W,电流 1.5A。AP2402 可实现三段功能切换,通过MODE1/2/3 切换三种功能模式:全亮&#xf…

STM32 学习(一)新建工程

本课程使用的stm32型号 引脚定义,有FT能接5v,没有FT能接3.3v 启动配置 第二种启动模式中,系统存储器中存放了一部分Bootloader程序,该程序可以接收串口的数据,然后刷新到主闪存中,这样就可以使用串口下载程…

【经验分享】日常开发中的故障排查经验分享(一)

目录 简介CPU飙高问题1、使用JVM命令排查CPU飙升100%问题2、使用Arthas的方式定位CPU飙升问题3、Java项目导致CPU飙升的原因有哪些?如何解决? OOM问题(内存溢出)1、如何定位OOM问题?2、OOM问题产生原因 死锁问题的定位…

uni-app引入vant表单(附源码)

新建项目 下载安装vant npm i vant main.js引入 import { Form } from vant; import { Field } from vant;Vue.use(Form); Vue.use(Field);代码引入 <van-form submit"onSubmit"><van-fieldclass"rePwd"v-model"username"name"请…

【51单片机系列】DS18B20温度传感器扩展实验之设计一个智能温控系统

本文是关于DS18B20温度传感器的一个扩展实验。 文章目录 一、相关元件介绍二、实验分析三、proteus原理图设计四、软件设计 本扩展实验实现的功能&#xff1a;利用DS18B20设计一个智能温度控制系统&#xff0c;具有温度上下限值设定。当温度高于上限值时&#xff0c;电机开启&a…

flask之文件管理系统-项目 JRP上线啦!!! ----Bug版

既然单人应用那么就不需要注册、登录了&#xff0c;太麻烦&#xff0c;直接上功能项&#xff0c;而初版太不好看了&#xff0c;略微修改归纳了一下&#xff0c;出了第一版 很有精神&#xff0c;为了纪念&#xff0c;这个网页项目我命名为JRP 主要就是&#xff1a; 1、定义一个类…

Kubernetes之Ingress详解

目录 IngressIngress配置配置写法转发到单个后端服务不同的URL路径被转发到不同的服务上不同的域名转发到不同的服务上不使用域名的转发规则 Ingress Ingress 是 Kubernetes 中的一种 API 对象&#xff0c;用于管理和配置集群中的 HTTP 和 HTTPS 服务路由。 Ingress 可以在 K…

目标检测-One Stage-YOLOv1

文章目录 前言一、YOLOv1的网络结构和流程二、YOLOv1的损失函数三、YOLOv1的创新点总结 前言 前文目标检测-Two Stage-Mask RCNN提到了Two Stage算法的局限性&#xff1a; 速度上并不能满足实时的要求 因此出现了新的One Stage算法簇&#xff0c;YOLOv1是目标检测中One Stag…

如何批量提取pdf文件名到excel?

如何批量提取pdf文件名到excel&#xff1f;在大家整理PDF文档的时候会不会遇到下面这些问题&#xff0c;首先PDF过多&#xff0c;每个PDF文件都有自己的名字&#xff0c;我们想要分类排放的话非常麻烦&#xff0c;不仅耗费时间而且带来的收益非常低&#xff0c;然后即使我们整理…

docker +gitee+ jenkins +maven项目 (一)

jenkins环境和插件配置 文章目录 jenkins环境和插件配置前言一、环境版本二、jenkins插件三、环境安装总结 前言 现在基本都是走自动化运维&#xff0c;想到用docker 来部署jenkins &#xff0c;然后jenkins来部署java代码&#xff0c;做到了开箱即用&#xff0c;自动发布代码…

eBay自养号测评:提升销量与排名的安全可控之道

近年来&#xff0c;eBay平台吸引了大量商家入驻&#xff0c;许多原本在其他平台的卖家也纷纷转型至eBay。然而&#xff0c;许多商家在运营一段时间后发现&#xff0c;新账号的流量扶持期结束后&#xff0c;店铺流量开始下滑。面对这种情况&#xff0c;卖家应该采取哪些措施呢&a…

elasticsearch系列五:集群的备份与恢复

概述 前几篇咱们讲了es的语法、存储的优化、常规运维等等&#xff0c;今天咱们看下如何备份数据和恢复数据。 在传统的关系型数据库中我们有多种备份方式&#xff0c;常见有热备、冷备、全量定时增量备份、通过开发程序备份等等&#xff0c;其实在es中是一样的。 官方建议采用s…

YOLOv5改进 | 2023主干篇 | 华为最新VanillaNet主干替换Backbone实现大幅度长点

一、本文介绍 本文给大家来的改进机制是华为最新VanillaNet网络&#xff0c;其是今年最新推出的主干网络&#xff0c;VanillaNet是一种注重极简主义和效率的神经网络架构。它的设计简单&#xff0c;层数较少&#xff0c;避免了像深度架构和自注意力这样的复杂操作(需要注意的是…