Unity | Shader基础知识(第十六集:简单的全息扫描效果)

目录

一、前言

二、准备模型

三、 场景准备

 四、代码准备

五、透明度设置

六、补充介绍

1.Pass语法介绍

2.ColorMask

 七、作者的碎碎念


一、前言

这节课的内容是接着弧形边缘光的效果之后做的。

Unity | Shader基础知识(第十四集:简单效果练习)_unity shader 实例-CSDN博客

做出的效果如(图1、2所示)

图1 全息车

 

图2 全息车

二、准备模型

我们学习嘛~随便来一个模型就行,可以在unity商店下一个,免费的。

图1 unity商店

我每次都会把素材准备写上,因为我初学的时候,总找不到素材。up下载的是这个(如图2所示)。

图2 模型选择

三、 场景准备

如果你和我下载的是同一个模型,你放进场景里(如图3所示)

图3 车模型

 四、代码准备

下方是之前第十四集做弧形光的代码,我们在这个代码的基础上学。把这个代码的shader设置在材质球上。

Shader "Custom/012"
{
     Properties
    {
    _Color("Color",Color)=(0,0.5,0.5,0)
                        //这里把范围改成了0.5-20
    _Power("Power",Range(0.5,20)) = 3
    }

    SubShader
    {
            CGPROGRAM
            #pragma surface surf Lambert

            float4 _Color;
            float _Power;

            struct Input
            {
                float3 viewDir;
            };

            void surf(Input IN,inout SurfaceOutput o)
            {
                half dotp =1-saturate(dot(normalize(IN.viewDir),o.Normal));
                o.Emission =_Color.rgb * pow(dotp,_Power);
            }
            ENDCG
       }
}

 这个车里面有很多零件,假设我们现在只做车身。我们把车身的一些位置换成我们新写的材质。(如图4所示)

图4 材质替换

你也可以都换了,只是效果不一样而已。到此,我们其实已经获得了一个发光的车。材质的颜色可以调成自己喜欢的颜色,这里也略了。

五、透明度设置

全息的一个主要参与因素,就是颜色。因为现在还是教学,我们先只实现一个大概的效果。我们让现在不发光的地方透明。

(如图5所示)当红框的位置不等于0时,会发光,也就是说,这个数和0越接近,就越需要透明。

透明度本身就是0的时候是透明的,1的时候是实心的,所以,得出代码。

图5 代码

所以,得出代码如下:

            void surf(Input IN,inout SurfaceOutput o)
            {
                half dotp =1-saturate(dot(normalize(IN.viewDir),o.Normal));
                o.Emission =_Color.rgb * pow(dotp,_Power);
                //把透明度加进去
                o.Alpha = pow(dotp,_Power);
            }

加了透明度,别忘记了:

            Tags
            {
            "Queue" ="Transparent"
            }

            CGPROGRAM
            #pragma surface surf Lambert alpha:fade

 然后你就会得到(如图6所示)

图6 透明车

因为颜色太单一了,就不太好看,我们希望渐变一点,就在 Emission里面增大一点,自发光是随着发光的强弱会变颜色的。

void surf(Input IN,inout SurfaceOutput o)
{
      half dotp =1-saturate(dot(normalize(IN.viewDir),o.Normal));
                                           //这里放大一点自发光倍数
      o.Emission =_Color.rgb * pow(dotp,_Power)*10;
      o.Alpha = pow(dotp,_Power);
}

你就会收到一个颜色渐变的车。(如图7所示)

图7 渐变色车

这时候你去移动参数,已经有扫描的效果了。(如图8所示)

图8 全息效果车

六、补充介绍

 上面的车在消失以后是可以看见内饰的,如果你需要一个看不见内部结构的车,就需要在shader里面添加新的代码。

1.Pass语法介绍

Pass的写法以前讲过了。

Unity | Shader基础知识(第二集:shader语言的格式)_unity shader语言-CSDN博客

Pass是通道的意思,可以在一个shader脚本里写不同的渲染,然后你就可以选择,调用哪一个pass(如图9所示)。

图9 调用pass

如果在所有地方都没有专门设置渲染哪个,不渲染哪个,先哪个后哪个,那所有pass会挨个渲染。

 那在这里旧事重提的原因是,有一些设定,智能写在pass里面,不能写在外面。

2.ColorMask

这是个什么东西呢?就是你再渲染这个材质所在的东西时,肯定视线里面不光有一个物体,肯定有很多。(如图10所示,所以我们车门后面有蓝色的其他内饰)。

如果你的车不是透明的,那肯定可以遮挡上。(如图10所示)

图10 实心车

那透明的,如果我又不想显示后面怎么办? 

这时候我们就可以用ColorMask,可以选择这些被挡住的东西要不要显示出来,显示哪部分颜色?

ColorMask R,意思是输出颜色中只有R通道会被写入

ColorMask G,意思是输出颜色中只有G通道会被写入

ColorMask B,意思是输出颜色中只有B通道会被写入

ColorMask A,意思是输出颜色中只有A通道会被写入

ColorMask RGB 或者GB,或者RB等,或者其他组合,然后相应的通道会被写入

ColorMask 0,清空所有颜色

我们希望所有遮挡的都不显示,就用0这个。

但是,这个只能写在Pass里,而且,我们是先清空,再画别的,所以这个Pass要写在前面。代码如下:

Shader "Custom/012"
{
     Properties
    {
    _Color("Color",Color)=(0,0.5,0.5,0)
    _Power("Power",Range(0.5,20)) = 3
    }

    SubShader
    {
            Tags
            {
            "Queue" ="Transparent"
            }

            //这里先把遮挡的都清空
            Pass{
            ColorMask 0
            }

            //然后再把别的显示出来
            CGPROGRAM
            #pragma surface surf Lambert alpha:fade

            float4 _Color;
            float _Power;

            struct Input
            {
                float3 viewDir;
            };

            void surf(Input IN,inout SurfaceOutput o)
            {
                half dotp =1-saturate(dot(normalize(IN.viewDir),o.Normal));
                o.Emission =_Color.rgb * pow(dotp,_Power)*10;
                o.Alpha = pow(dotp,_Power);
            }
            ENDCG
       }
}

 七、作者的碎碎念

你们还想看什么效果,记得留言哦~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kivy tutorial 005: A drawing app

Kivy tutorial 005: A drawing app – Kivy Blog Central themes: Canvas instructions 中心主题: canvas 结构 The next couple of tutorials will move to a new application in order to showcase some more of Kivy’s core components. In this tutorial we…

windows USB设备驱动开发通用技术

通用串行总线 (USB) 设备通过配置、接口、备用设置和终结点来定义其功能和功能,下面提供这些概念的高级概述。 常见 USB 方案 获取用于通信的设备句柄 ,并使用检索到的句柄或对象发送数据传输。 USB 描述符检索 以获取有关设备配置的信息、接口、设置及…

python基础语法 003-3 数据类型元组

1 元组 1.1 元组含义 1.1.1 元组的表示 #元组的表示方法:() names ("xiaoyun", "xiaoming") print(names)--结果------- (xiaoyun, xiaoming) 1.1.2 空元组 #空元组 names () print(type(names)) print(len(names))----------------结果--------- &l…

Profibus DP主站转Modbus模块连接马达保护器案例

一、概述 在工业自动化控制系统中,Profibus DP和Modbus是常见的通信协议,在同一现场还有可能遇到Modbus协议,ModbusTCP协议,Profinet协议,Profibus协议,Profibus DP协议,EtherCAT协议&#xff…

vant组件 顶部下拉刷新和页面底部下拉获取数据+顶部搜索框

1.html部分&#xff08;顶部tab切换无&#xff0c;只有主体list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"请输入搜索关键词"search"…

【ARM】Ulink不同的系列对于芯片的支持和可以支持keil软件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 了解不同版本的ULINK可以支持的芯片架构&#xff0c;和ULINK可以和哪个系列的keil软件进行在线调试 2、 问题场景 用于了解不同ULINK仿真器对于芯片的支持是不一样的&#xff0c;并不是ULINK可以支持所有的keil软件…

qmt量化交易策略小白学习笔记第44期【qmt编程之期货行情数据】

qmt编程之获取期货行情数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 获取行情数据 提示 使用该接口时&#xff0c;需要先订阅实时行情(subscribe_quote)或下载过历史行情(download_hi…

贪心算法——加工木棍(C++)

上大学&#xff0c;一天是一天&#xff0c;两天也是一天。 ——2024年6月27日 之前考试周断更了&#xff0c;今天重新开始&#xff01; 题目描述 有n根木棍&#xff0c;已知每根木棍的长度和重量。这些木棍在木工机器上加工&#xff0c;机器准备加工木棍需要一些时间&#xf…

YOLOv8数据集标注

1 简介 数据集是必不可少的部分&#xff0c;数据集的优劣直接影响训练效果。一般来说&#xff0c;一个完整的数据集应该包括训练集、测试集和验证集。通常&#xff0c;数据集会被划分为训练集和测试集&#xff0c;比如将数据集的70%用作训练集&#xff0c;30%用作测试集。在进行…

深度学习在蛋白质结构预测的新突破:AlphaFold、RoseTTAFold与ESMFold

在蛋白质结构预测和功能预测领域&#xff0c;基于机器学习的方法最近取得了显著的进展。特别是深度学习技术在这个领域中展现出了强大的能力&#xff0c;代表性的技术有 DeepMind 的 AlphaFold 和 RoseTTAFold。这些技术利用了大量的生物数据和先进的神经网络架构&#xff0c;极…

【科学计算与可视化】3. Matplotlib 绘图基础

安装 pip install matplotlib 官方文档 https://matplotlib.org/stable/api/pyplot_summary.html 主要介绍一些图片绘制的简要使用&#xff0c;更加详细和进阶需要可参考 以上官方文档。 1 绘制基础 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴…

在vscode 中ssh连接虚拟ubuntu,不能使用code打开文件

这是参考别人的文章&#xff1a;https://blog.csdn.net/weixin_44465434/article/details/130035032找到vscode的版本信息&#xff0c;提交后面是需要的打开home/(用户)/.bashrc&#xff0c;添加环境变量 export PATH"~/.vscode-server/bin/5437499feb04f7a586f677b155b03…

6.22套题

B. Dark 题意&#xff1a;每次能在数列中能使相邻两个数-1&#xff0c;求当数列没有连续非0值的最小贡献 解法:设表示前i个数中前i-1个数是否为0&#xff0c;当前数是j的最小贡献。表示i1以后减掉d的最小贡献。 C. 幸运值 D. 凤凰院真凶

Docker 日志

日志记录是任何生产应用程序中至关重要的一部分。当出现问题时&#xff0c;日志可以是恢复服务的关键工具&#xff0c;所以它们需要做好。在 Linux 系统上&#xff0c;我们期望通过一些常见方式与应用程序日志交互&#xff0c;有些方式更好。如果您在一台计算机上运行应用程序进…

文华财经盘立方均线-支撑压力自动画线多空声音预警指标公式源码

文华财经盘立方多空均线-支撑压力自动画线指标公式源码&#xff1a; //MA5:MA(C,5); //MA10:MA(C,10); MA20:MA(C,20),COLORRED; MA60:MA(C,60),COLORGREEN; TY:CLOSE; HD:FILTER(BACKSET(FILTER(REF(TY,10)HHV(TY,2*101),10),101),10); LD:FILTER(BACKSET(FILTER(REF(T…

openlayer 图层绘制成多种颜色的一个图层

技术栈&#xff1a; 因为是旧项目的优化功能&#xff0c;这里主要介绍实现思路。技术栈&#xff1a;openlayer 6.5^、jquery、layui组件。 背景&#xff1a; 在创建一个地图对象后&#xff0c;如何创建此处省略。这里主要讲解如何根据接口的数据来把水深测量时间的图层根据不同…

vue2的待办事项案例

头部组件 <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" keyup.enter"add"/></div> </template><script>import {nanoid} fro…

智能语音抽油烟机:置入WTK6900L离线语音识别芯片 掌控厨房新风尚

一、抽油烟机语音识别芯片开发背景 在繁忙的现代生活中&#xff0c;人们对于家居生活的便捷性和舒适性要求越来越高。传统的抽油烟机操作方式往往需要用户手动调节风速、开关等功能&#xff0c;不仅操作繁琐&#xff0c;而且在烹饪过程中容易分散注意力&#xff0c;增加安全隐…

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC

Java登录管理功能的自我理解(尚庭公寓)

登录管理 背景知识 1. 认证方案概述 有两种常见的认证方案&#xff0c;分别是基于Session的认证和基于Token的认证&#xff0c;下面逐一进行介绍 基于Session 基于Session的认证流程如下图所示 该方案的特点 登录用户信息保存在服务端内存&#xff08;Session对象&#xff…