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"

}

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

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

相关文章

一起玩儿物联网人工智能小车(ESP32)——13. 用ESP32的GPIO控制智能小车运动起来(一)

摘要:本文更深入的讲述了GPIO的相关知识,并完成了导线连接工作,为下一步的软件开发做好了准备。 通用输入输出端口(GPIO:General Purpose Input/Output Port),在前面已经有了初步的介绍&#xf…

Baumer工业相机堡盟相机如何使用NEOAPI SDK实现相机的连接(C++)

Baumer工业相机堡盟相机如何使用NEOAPI SDK实现相机的连接(C) Baumer工业相机Baumer工业相机SDK技术背景代码分析第一步:先使用NEOAPI函数查找相机第二步:连接相机后对相机进行采图第三步:将采集的图像显示在UI界面上 …

乘势而上开新年!2024深圳深圳户外家具及休闲用品展览会三月开幕

中国户外家具市场在九十年代末开始崭露头角,随着国家经济的腾飞,尤其是房地产行业的迅猛发展,加上现代商业模式的建立和完善,产品和需求都以惊人的速度在发展。无论是国际知名品牌,还是国内的专业户外家具生产企业&…

Fiddler 抓包工具的安装与使用

今天分享Fiddler 抓包工具的安装与使用,基于HTTP应用层协议的抓包工具。 一、下载安装 1、下载地址: The Ultimate Web Debugging Tool - Download Fiddler Everywhere | Telerik 选择相应类型: 2、下载完成 3、安装 傻瓜式安装&#xf…

【OpenAI Q* 超越人类的自主系统】DQN :Q-Learning + 深度神经网络

深度 Q 网络:用深度神经网络,来近似Q函数 强化学习介绍离散场景,使用行为价值方法连续场景,使用概率分布方法实时反馈连续场景:使用概率分布 行为价值方法 DQN(深度 Q 网络) 深度神经网络 Q-L…

【JVM篇】Java是如何实现平台无关的?

Java是如何实现平台无关的? ✔️什么是平台无关性✔️平台无关性的实现✔️Java虚拟机✔️字节码✔️Java语言规范 ✔️扩展知识仓✔️平台无关性的好处✔️ 有哪些语言实现了平台无关?✔️Java中基本数据类型的大小都是确定的吗? ✔️什么是平台无关性 平台无关性就是一种语…

shiro1.10版本后-IniSecurityManagerFactory过期失效

1、问题概述? 今天在研究了shiro的新版本shiro1.13.0版本,发现用了很长时间的IniSecurityManagerFactory工厂失效了。 从下图中可以看出,在新版本中IniSecurityManagerFactory被打上了过期线了。 那么问题来了,新版本如何使用呢…

六、从0开始卷出一个新项目瑞萨RZN2L之loader app分离工程优化

六、loader app分离工程 6.1 概述 6.2 官方资料与不足 6.3 loader app分离工程的优化 6.3.1 自动调节合并appsection 6.3.2 loader中使用外设 6.3.3 app使用sram mirror 6.3.4 sram atcm同时使用 六、从0开始卷出一个新项目之瑞萨RZN2L loader…

2024年科技行业十大经济预测

当我们站在新的一年的风口浪尖上时,科技行业正准备迎接重大变革和创新,这些变革和创新将塑造2024年的经济格局。以下是未来一年科技行业的十大经济预测。 低代码:低代码和无代码平台从 3 年前开始被大规模的应用,发展到现在已经逐…

最优化方法Python计算:无约束优化应用——逻辑回归模型

S型函数 sigmoid ( x ) 1 1 e − x \text{sigmoid}(x)\frac{1}{1e^{-x}} sigmoid(x)1e−x1​将全体实数 R \text{R} R映射到 ( 0 , 1 ) (0,1) (0,1),称为逻辑函数。其图像为 该函数连续、有界、单调、可微,性质量好。拟合函数为 F ( w ; x ) sigmoi…

阿里云服务器优惠活动大全

阿里云服务器优惠活动大全包括:云服务器新人特惠、云小站、阿里云免费中心、学生主机优惠、云服务器精选特惠、阿里云领券中心等,活动上阿里云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年63元,…

电脑开机自动断电,简单4招,快速解决!

“不知道我的电脑最近是怎么回事,每次一开机就会出现自动断电的情况,有什么方法可以解决吗?” 在使用电脑时,由于电源供应不稳定或过热,以及各种硬件问题,可能会导致电脑开机自动断电。遇到这种情况&#x…