Unity | Shader基础知识(第二十集:应用-简易流光、LOD)

目录

一、前言

二、LOD

1.什么是LOD

2.代码如何调节LOD

三、流光

1.资源准备 

2.uv移动 

3.获取图片中的uv

4.改变uv去取流光的颜色(时间的应用)

5.图片叠加

6.透明图片的叠加

四、纯净代码

五、作者的碎碎念


一、前言

有小伙伴问,它总看见LOD,LOD是什么意思?

所以我们今天的文章分成两部分:

1.LOD的讲解

2.图像的扭曲

二、LOD

目前不想知道可以跳过,知道是可以删的东西就行了。

1.什么是LOD

我们经常在shader里面看见LOD,那LOD是干什么的呢?

示例如下。

        Tags { "RenderType"="Opaque" }LOD 100

答:区分到底哪些shader渲染,哪些shader不渲染。 

因为每个人的电脑和手机是不一样的,所以同样是游戏,他也会有不同的画质,例:王者荣耀画质选择。(如图1所示)

图1 王者荣耀

不同的画质,本质上就是运行的shader不一样。

内置着色器等级划分如下:

VertexLit着色器= 100
贴花,反射性顶点光= 150
漫射= 200
漫反射细节,反射凹凸未照明,反射凹凸VertexLit = 250
凹凸,镜面反射= 300
凹凸镜面反射= 400
视差= 500
视差镜面反射= 600

总结:就是数字高一点,加一点显示效果,最开始只有基本物体,然后加反光,再加漫反射.....等

2.代码如何调节LOD

在unity里有一行代码,可以直接调节LOD。

Shader.globalMaximumLOD = 100;

翻译:所有Shader最大的LOD是100。

那么此时此刻,你设置的其他200、300之类的shader都不会被执行。

其实,在我们学习的时候,可以无视它。 

三、流光

之前我们写好的shader都是固定的,换句话说,只要我手不动,我的shader就不会动。但流光明显是随着时间而不停变化的。(如图2所示)

图2 流光

全部过程(了解全部过程,这样就胸有成竹啦):

1.我们有两张图,一张放下面,一张放上面,下面是柠檬,上面是流光。

2.我们要获取图片的uv,因为图片大,流光小,我们需要流光从头走到尾。

3.按照图片的uv在流光上取颜色。

4.每次取到图片uv之后,把uv+时间,再按照新的uv去取流光的颜色。

5.因为时间是一直在变的,所以uv+时间也会一直改变,所以取到的颜色位置也会一直改变,这样流光就形成了。

1.资源准备 

流光其实是一个斜的半透明的图。(如图3所示)没有可以去ppt里画一个,还是挺简单的。

图3 流光透明贴图
2.uv移动 

流光的移动,并不是我们平时写代码里面的位置,它是uv的移动。(如图4所示)

图4 移动uv

这个移动实际上是颜色采样的移动,本来左上角的坐标,只会去图片的左上角去取颜色,但现在它往中间去取颜色,那我们看到的图片位置就会变。

3.获取图片中的uv

获取图片uv的方法。

   //按照V中的uv来获取图片中的uv     
TRANSFORM_TEX(v.uv, _MainTex)//图片叫MainTex

但是用到这个方法,必须要引用float4 _MainTex_ST,这个是用来保证uv采样是对的。 因为我们采样的是_MainTex才是_MainTex_ST,如果是采样的别的,就是别的_ST

想要了解具体原理可以自己百度哇~

这样我们就会获得图片的uv,改变这个uv,图片就会移动。

Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"//结构体appdatastruct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};//结构体v2fstruct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;sampler2D _Tex;//虽然没有用,但必须要有float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);//获取图片的uv,放到结构体中o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}ENDCG}}
4.改变uv去取流光的颜色(时间的应用)
            fixed4 frag (v2f i) : SV_Target{//获取到之前传入的图片的uvfloat2 flashUV = i.uv;//加上时间flashUV.x += _Time.y;//用修改过的uv提取了流光的颜色中的透明度fixed flashAlpha = tex2D(_Tex, flashUV ).a;}

备注:

_Time是程序运行时间,这个时间的意思是,从点击开始程序后,_Time是0,然后就一直往上加....1、2、3、4、5、6、7、8.....等等。

但是在用这个时间时,有时会觉得太大了,有时会觉得太小了,所以封存了一些算法在里面。

_Time.x        表示t / 20,
_Time.y        表示t,
_Time.z        表示t * 2,
_Time.w        表示t* 3 

这时,如果你觉得时间太快,你可以用 _Time.x,它就是累计时间/20,反之,当你觉得太慢,你也可以用_Time.z 或者_Time.w。

当然,你也可以自己做乘除运算,例:_Time.y/10。

还有其他常用的Time:

_SinTimefloat4xyzw分别是:Sin (t/8, t/4, t/2, t).
_CosTimefloat4xyzw分别是: Cos(t/8, t/4, t/2, t).
unity_DeltaTimefloat4xyzw分别是:unity_DeltaTime (dt, 1/dt, smoothDt, 1/smoothDt).

本次我们就用_Time.y,但为了自己能调节速度,我们加了一个可以调节速度的参数。

    Properties{_MainTex ("Texture", 2D) = "white" {}_Tex ("Texture", 2D) = "white" {}//速度_Speed("Speed",float) = 0.5}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;sampler2D _Tex;float4 _MainTex_ST;float _Speed;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{float2 flashUV = i.uv;//乘一个参数flashUV.x += _Time.y*_Speed;}ENDCG}}
5.图片叠加

这里的流光是白色,所以我们就用float4(1,1,1,1)来表示了。白色乘上对应的透明度,就是我们的流光图片。

正常的图片就正常取样,把他们加起来,就是我们最后的流光图片了。

为了能改变流光的强度,我也多增加了一个参数:_Level

fixed4 frag (v2f i) : SV_Target{float2 flashUV = i.uv;flashUV.x += _Time.y*_Speed;fixed flashAlpha = tex2D(_Tex, flashUV ).a * _Level;//颜色相加fixed4 col= tex2D(_MainTex, i.uv) + float4(1,1,1,1)*flashAlpha;return col;}
6.透明图片的叠加

顶点和片元着色器需要叠加透明图片,必须开混合模式,就是Blend,这个未来再讲,我们先知道要加一个:Blend SrcAlpha OneMinusSrcAlpha就可以了。

四、纯净代码

Shader "Unlit/016"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Tex ("Texture", 2D) = "white" {}_Speed("Speed",float) = 0.5_Level("Level",Range(0,1)) = 0.5}SubShader{Blend SrcAlpha OneMinusSrcAlphaPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;sampler2D _Tex;float4 _MainTex_ST;float _Speed;float _Level;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{float2 flashUV = i.uv;flashUV.x += _Time.y*_Speed;fixed flashAlpha = tex2D(_Tex, flashUV ).a * _Level;fixed4 col= tex2D(_MainTex, i.uv) + float4(1,1,1,1)*flashAlpha;return col;}ENDCG}}
}

五、作者的碎碎念

这样我们简单的流光就做好啦,有什么我没讲到或者讲错的地方,欢迎在评论区留言,我会改正的。

如果你觉得有用,给我点个赞吧,ღ( ´・ᴗ・` )比心~

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

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

相关文章

Studying-代码随想录训练营day45| 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

第45天,子序列part03,编辑距离💪(ง •_•)ง,编程语言:C 目录 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 115.不同的子序列 文档讲解:代码随想录不同的子序列 视频讲…

分布式搜索引擎ES--Elasticsearch集群

1.Elasticsearch集群的概念 分片机制:每个索引都可以被分片 索引my_doc只有一个主分片;索引shop有三个主分片;索引shop2有5个主分片;(参考前面案例) 每个主分片都包含索引的数据,由于目前是单机,所以副分片是没有的&a…

安全开发第一篇

文章目录 参与RASP、IAST等安全防护工具的开发技术背景开发流程技术挑战工具和资源示例结论 以phpstudydvwa为列 实现 SQL 注入检测脚本 参与RASP、IAST等安全防护工具的开发 参与 RASP(Runtime Application Self-Protection)和 IAST(Intera…

为开源奉献一份自己的力量:Cesium没有热力图组件,我们自己封装!

大家好,我是日拱一卒的攻城师不浪,专注可视化、数字孪生、前端提效、nodejs、AI学习、GIS等学习沉淀,这是2024年输出的第27/100篇文章。 交流合作:brown_7778 前言 热力图,在很多可视化场景开发中会被经常提到&#x…

electron 主进程和渲染进程

最近在整理electron 相关的项目问题,对自己来说也是温故知新,也希望能对小伙伴们有所帮助,大家共同努力共同进步。加油!!!! 虽然最近一年前端大环境不好,但是大家还是要加油鸭&#…

网安零基础入门神书,全面介绍Web渗透核心攻击与防御方式!

Web安全是指Web服务程序的漏洞,通常涵盖Web漏洞、操作系统洞、数据库漏洞、中间件漏洞等。 “渗透测试”作为主动防御的一种关键手段,对评估网络系统安全防护及措施至关重要,因为只有发现问题才能及时终止并预防潜在的安全风险。 根据网络安…

【Qt开发】No matching signal for on_toolButton_clicked() 解决方案

【Qt开发】No matching signal for on_toolButton_clicked() 解决方案 文章目录 No matching signal for xxx 解决方案附录:C语言到C的入门知识点(主要适用于C语言精通到Qt的C开发入门)C语言与C的不同C中写C语言代码C语言到C的知识点Qt开发中…

Linux安装青龙面板并将本地服务映射至公网实现远程访问

文章目录 前言一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用。本教程使用Docker部署青龙,如何安装Docker详见: 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 …

全局异常 @ControllerAdvice 该怎么写

本文首发于稀土掘金:全局异常 ControllerAdvice 该怎么写,该账号即为本人账号,非搬运。 问题由来 很多小伙伴刚进公司做项目的时候,会看到项目里面有一个ControllerAdvice标记的类,整个类的编码结构大概是这样子&…

程序员极力推荐的几款插件

前言 h之前分享程序员喜欢的神器之后,还是相当多的伙伴喜欢,那一期的工具不仅是协助你工作还是工作外摸鱼划水,体验感是相当不错的。 这一期我还是打算把我非常喜欢用的几款插件分享给大家,这几款差劲不仅帮助我节省很多时间&am…

2024年软件系统与信息处理国际会议(ICSSIP 2024)即将召开!

2024年软件系统与信息处理国际会议(ICSSIP 2024)将于2024年10月25-27日在中国昆明举行。引领技术前沿,共谋创新未来。ICSSIP 2024将汇聚来自世界各地的专家学者,他们将在会上分享最新的研究成果、技术突破及实践经验。会议议题涵盖…

WAAP替代传统WAF已成趋势

数字化时代,Web应用和API已成为企业运营的核心。然而,随着网络攻击手段的不断进化,自动化攻击愈发频繁,传统的Web应用防火墙(WAF)已难以满足现代企业的安全需求。WAAP(Web Application and API …

我出一道面试题,看看你能拿 3k 还是 30k!

大家好,我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场,接下来我会出一道经典的后端面试题,你只需要进行 4 个简单的选择,就能判断出来你的水平是新手(3k)、初级(10k)、中…

大镜山阿里巴巴国际站数据采集软件使用方法|阿里国际站商家信息采集软件使用方法|阿里国际站信息采集软件使用方法

大镜山阿里巴巴国际站数据采集软件一款采集阿里巴巴国际站alibaba.com商家数据的软件,采集的数据包括店铺名称、店铺年份、评分、邮件地址、手机号码、网址及社交连接等。 下载大镜山阿里巴巴国际站数据采集软件 大镜山阿里巴巴国际站数据采集软件下载地址 大镜山…

ubuntu20.04.6 安装Skywalking 10.0.1

1.前置准备 1.1. **jdk17(Skywalking10 jdk22不兼容,用17版本即可)**安装: https://blog.csdn.net/CsethCRM/article/details/140768670 1.2. elasticsearch安装: https://blog.csdn.net/CsethCRM/article/details…

Java-21推崇的虚拟线程到底有好快?一起来看这个实验

我们一起来看下面这个场景:十万个待执行任务,每个任务休眠两秒 1. 采用java-21的虚拟线程池来实现 public static void main(String[] args) throws InterruptedException{ExecutorService VIRTUAL_THREAD_POOL Executors.newThreadPerTaskExecutor(Th…

爬虫程序在采集亚马逊站点数据时如何绕过验证码限制?

引言 在电商数据分析中,爬虫技术的应用日益广泛。通过爬虫技术,我们可以高效地获取大量的电商平台数据,这些数据对于市场分析、竞争情报、价格监控等有着极其重要的意义。亚马逊作为全球最大的电商平台之一,是数据采集的重要目标…

pdf文件损坏打不开怎么修复?文档损坏原因和修复办法分享!

pdf是一种优点很多的软件,它在文件传输过程中格式不会乱掉,而且还可以加密,特别的方便。pdf这种文件格式,不仅能呈现文档,还可以呈现图像,工作中经常会用到。 不过,因为种种原因,有…

【iOS】——Block底层实现和捕获机制

Block的实质 Block的定义是带有自动变量的匿名函数,下面从源码的角度探究下Block究竟是什么 下面是一个Block的简单实现: int main(int argc, const char * argv[]) {autoreleasepool {// insert code here...void (^blk)(void) ^{printf("Bloc…

WordPress原创插件:搜索引擎抓取首图seo图片

WordPress原创插件:搜索引擎抓取首图seo图片 插件设置 插件将在网站头部添加适当的meta标签,以便百度等搜索引擎抓取指定的固定图像。 插件下载 https://download.csdn.net/download/huayula/89596527