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

news2024/11/15 15:39:49

目录

一、前言

二、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"
            
            //结构体appdata
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
            
            //结构体v2f
            struct 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
            {
                //获取到之前传入的图片的uv
                float2 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 OneMinusSrcAlpha

        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;
            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.coloradmin.cn/o/1971655.html

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

相关文章

使用腾讯云域名解析实现网站重定向

前言 最近,在CSDN平台上我写了一系列博客,希望能与同学分享一些技术心得。然而,每当需要向他人推荐我的博客时,那串复杂且缺乏规律的CSDN博客首页域名总让我感到不便。这让我开始思考,如果能将这一域名替换为一个既个…

技术速递|VS Code Java 7月更新 - Gradle 支持增强!用户体验改进与 Spring 新功能

作者:Nick Zhu 排版:Alan Wang 大家好,欢迎来到 Visual Studio Code 7月份的 Java 更新!本博客将覆盖最新的 Gradle 功能增强、用户体验改进以及新的 Spring 功能,让我们开始吧! Gradle 功能增强 支持 Gr…

算法强训day19

一、小易的升级之路 链接&#xff1a;小易的升级之路_牛客题霸_牛客网 简单题 #include<iostream> using namespace std; long long gcd(long long m, long long x) {long long n ;while(x>0){n m % x;m x;x n;}return m; } int main() {int n;long long m;cin &…

文件上传漏洞--之upload-labs靶场(第6-10关)专栏更新ing......

注意&#xff1a; 为避免执行之前关卡的上传了的php文件代码&#xff0c;可以将upload文件夹下的文件清空 第六关&#xff1a; 第一步&#xff1a;查看源码 对比前面的几个关卡&#xff0c;里面没有文件去空格语句&#xff0c;可以使用后缀名加空格绕过 第二步&#xff1a;…

Python初学者必须掌握的基础知识点

Python初学者必须掌握的基础知识点包括数据类型与变量、控制结构&#xff08;条件语句和循环语句&#xff09;、基本数据结构&#xff08;列表、元组、字典、集合&#xff09;、函数与模块、以及字符串处理等。以下是对这些基础知识点及其对应代码的详细介绍&#xff1a; 1. …

Git常用命

转自&#xff1a;https://blog.csdn.net/ahjxhy2010/article/details/80047553 1.查看某个文件或目录的修改历史 git log filename #查看fileName相关的commit记录 git log -p filenam # 显示每次提交的diff#只看某次提交中的某个文件变化&#xff0c;commit-id  文件名…

【视频讲解】CatBoost、LightGBM和随机森林的海域气田开发特征分类研究

原文链接&#xff1a;https://tecdat.cn/?p37208 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Changlin Li 本文将通过视频讲解&#xff0c;展示如何用CatBoost、LightGBM和随机森林的海域气田开发特征智能分类&#xff0c;并结合一个python分类预测职员离…

虚拟网卡添加ip

1.虚拟机网卡添加 1.进入虚拟机设置添加网卡即网络适配器 2.配置文件修改 1.查看网卡是否添加成功 ip ad ifconfig 其中ens161就是我们新添加的设备同时这个ens161也是我们硬件名字 2.进入系统配置文件 cd /etc/sysconfig/network-scripts/#配置文件目录[rootlocalhost ne…

小程序~~4(npm支持+分包加载+开放功能)

目录 1.npm支持 自定构建npm vant组件库的使用 vant app组件样式覆盖 2.分包加载 介绍 分包加载及打包引用原则 独立分包的配置 分包预下载 3.开放能力 获取微信头像 获取微信昵称 转发功能 分享到朋友圈 手机号验证组件 客服功能 框架接口-getApp() 页面间通…

使用hutool工具将数字类型集合转换为字符串数组,long类型集合转字符串集合或数组相互转换

1.导入hutool的maven依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>2.直接复制代码运行 import cn.hutool.core.convert.Convert; import java.…

C语言:指针(2)

一.数组名 在了解数组名前我们先看一段代码 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 根据我们上一篇学习的知识&#xff0c;我们知道&arr[0]是数组第一个元素的地址&#xff0c;这时我们再看另一段代码的运行结果。 #include <stdio.h> int ma…

U盘文件或目录损坏的应对之策:从绝望到希望

遭遇困境&#xff1a;U盘文件或目录的隐形危机 在日常的数字存储与传输中&#xff0c;U盘以其便携性和高容量成为了我们不可或缺的工具。然而&#xff0c;当U盘中的文件或目录突然损坏且无法读取时&#xff0c;这份便捷瞬间化为了困扰。面对屏幕上冰冷的错误提示&#xff0c;用…

【人工智能】Transformers之Pipeline(七):图像分割(image-segmentation)

目录 一、引言 二、图像分割&#xff08;image-segmentation&#xff09; 2.1 概述 2.2 技术原理 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#xff…

【mongodb】mongodb分片高可用以及加密操作

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

Prometheus+Alertmanager+邮件告警

参考node_exporter-CSDN博客&#xff0c;球球不要断更&#xff01;&#xff01;&#xff01;&#xff01; 大致流程 1.部署promethus 可以写一个自定义的 systemd 服务启动文档&#xff0c;详情见自定义的 systemd 服务启动方式-CSDN博客 [rootlocalhost system]# sudo tee /e…

python-局部求和(赛氪OJ)

[题目描述] 输入 2020 个整数&#xff0c;输出其中能被数组中其它元素整除的那些数组元素。输入格式&#xff1a; 输入一行&#xff0c;输入 2020 个整数&#xff0c;中间用空格隔开。输出格式&#xff1a; 输出能被数组中其他元素整除的元素&#xff0c;每行输出一个。样例输入…

Sqlserver递归生成日期范围

文章目录 Sqlserver递归生成日期范围业务背景SQL脚本执行结果 Sqlserver递归生成日期范围 业务背景 有时候需要按天生成数据&#xff0c;需要用到日期表进行循环处理 SQL脚本 ;WITH DateRange AS ( SELECT 1 AS Seq, 2024-01-01 AS DateValue UNION ALL SELECT Seq1 Seq, C…

苹果手机升级iOS18测试版本后使用体验不好?怎么降级?

近期苹果发布了诸多的iOS18版本给用户提前尝鲜测试&#xff0c;许多果粉们都迫不及待的选择了升级&#xff0c;但是有不少的果粉升级时没有考虑到设备适配性问题&#xff0c;导致升级之后手机变得有些卡顿&#xff0c;使用体验不好时&#xff0c;想要降级回到正式的版本&#x…

双向链表知识点(附源代码)

双向链表的特点 带头链表⾥的头结点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位结点不存储任何有效元素&#xff0c;只是站在这⾥“放哨的” 例图解析 双向链表与单链表的区别 双向链表&#xff1a;除了存储的数据外还有两个指针&#xff0c;具有头节点&#xff0c;还有…

【秋招笔试】24-08-01-用友-秋招笔试题

🍭 大家好这里是清隆Coding ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 ⌚️ 01.物流网络安全节点 问题描述 L…