《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.8 创建全息着色器

简介:

本节书摘来自华章计算机《Unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.8节,作者 [英]艾伦朱科尼(Alan Zucconi)[美]肯尼斯拉默斯(Kenneth Lammers),译 占红来,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.8 创建全息着色器

每年都有越来越多的太空主题游戏问世,科幻游戏的一个重要组成部分是如何在游戏中集成一些未来科技感。全息技术就是这样一种非常适用于创造未来科技感觉的着色技术。全息着色有很多不同的表现形式,但是通常都是用来渲染一些半透明的尖锐物体。这一节会告诉你如何创建类似的特效。首先要记住一点:可以通过噪声、动画扫描线以及振动来创建一些非常卓越的全息特效。下图是一个使用全息特效制作的物体的图像:

image

2.8.1 准备工作

因为全息特效只会显示物体的轮廓,所以我们将这个着色器称为Silhouette。将着色器附着到一个材质然后将材质指定给三维模型。

2.8.2 操作步骤

按照下面的步骤,可以将已有的着色器转换为一个全息着色器:

  1. 给着色器添加如下属性:
    image
  2. 给CGPROGRAM部分添加如下变量:
    image
  3. 因为材质是透明的,所以添加如下标签:
    image

 根据所使用的物体类型的不同,你可能想要显示物体的背面,如果这样的话需要添加Cull Off来确保物体的背面不会被移除掉。

  1. 这个着色器不是用来模拟真实材质的,所以没有必要使用PBR光照模型。这里使用朗伯反射(Lambertian reflectance),朗伯反射是一种非常廉价的光照模型。此外需要通过设置nolighting来禁用所有光照,还需要通过alpha:fade来告知Cg这应该是一个透明着色器:
    image
  2. 修改Input结构,让Unity知道在当前视角方向和世界法线方向如何填充Input:
    image
  3. 使用下面的表面函数。记住一点:因为这个着色器使用朗伯反射作为其光照函数,所以表面函数的输出结构应该相应地修改成SurfaceOutput而不是SurfaceOutputStandard:
    image

现在可以使用Rim effect滑块来选择全息特效的强度了。

2.8.3 工作原理

前面已经提过,这个着色器只是渲染物体的轮廓。如果从另外一个角度观察物体,其轮廓会相应地发生变化。从几何学的角度来讲,模型的边缘是由那些法线垂直于当前视线方向的三角形构成的。相应地,在Input结构中,我们声明了参数wordNormal和viewDir。

判断两个向量是否正交可以通过计算其点积得知。如果两个向量是正交的,则二者的点积为0。我们使用_DotProduct来判断点积需要多么接近于0时才将三角形视为其轮廓。

这个着色器中的第二个方面是模型的边(完全可见)与_DotProduct确定的角度(不可见)之间的渐变褪色。这是通过下面的线性插值完成的:
image

最后,纹理中的初始alpha值与新计算的系数相乘来获得我们想要的全息效果。

2.8.4 更多内容

这个技术本身非常简单也相对比较廉价,可以用在大量其他特效上,比如:

  • 科幻游戏中包裹有某种颜色气体的星球
  • 某个选中物体或者当前鼠标下面的物体的轮廓
  • 鬼或者幽灵
  • 引擎中散发出的烟雾
  • 爆炸的冲击波
  • 太空飞船在遭到攻击时的泡泡护盾

2.8.5 参考

点积在计算反射的时候起了重要作用,在第3章中会详细解释其工作原理以及为何其广泛应用在很多着色器中。

相关文章
|
3月前
|
算法 vr&ar C#
使用Unity进行虚拟现实开发:深入探索与实践
【8月更文挑战第24天】使用Unity进行虚拟现实开发是一个充满挑战和机遇的过程。通过掌握Unity的VR开发技术,你可以创造出令人惊叹的VR体验,为用户带来前所未有的沉浸感和乐趣。随着技术的不断进步和应用场景的不断拓展,VR开发的未来充满了无限可能。希望本文能为你提供有用的指导和启发!
|
2月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
219 0
|
2月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
152 0
|
3月前
|
vr&ar 图形学 开发者
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
138 0
|
5月前
|
C# 图形学 C++
使用vscode开发C#+unity没有代码提示问题
使用vscode开发C#+unity没有代码提示问题
84 0
使用vscode开发C#+unity没有代码提示问题
|
5月前
|
图形学
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)
83 0
|
5月前
|
图形学
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)
71 0
|
5月前
|
图形学 索引
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)
127 0
|
6月前
|
图形学
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
|
6月前
|
算法 安全 图形学
Unity Hololens2开发|(十一)MRTK3 Solver(求解器)
Unity Hololens2开发|(十一)MRTK3 Solver(求解器)
下一篇
无影云桌面