偏移shaderuv_Unity Shader 之 uv动画

Unity 动画

Unity Shader 内置时间变量

引入时间变量

名称

类型

描述

_Time

float4

t是自该场景加载开始所经过的时间,4个分量分别是(t/20, t, 2t, 3t)

_SinTime

float4

t是时间的正弦值,(t/8, t/4, t/2, t)

_CosTime

float4

t是时间的余弦值,(t/8, t/4, t/2, t)

unity_DeltaTime

float4

dt是时间增量,(dt, 1/dt, smoothDt, 1/smoothDt)

纹理动画

使用一张纹理实现的动画,用于代替复杂的粒子系统来模拟动画效果。

u方向动画与v方向动画对比

序列帧动画

代码:

Shader "Unity Shaders Book/Chapter 11/Image Sequence Animation" {

Properties {

_Color ("Color Tint", Color) = (1, 1, 1, 1)

_MainTex ("Image Sequence", 2D) = "white" {}

_HorizontalAmount ("Horizontal Amount", Float) = 8

_VerticalAmount ("Vertical Amount", Float) = 8

_Speed ("Speed", Range(1, 100)) = 30

}

SubShader {

Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

Pass {

Tags { "LightMode"="ForwardBase" }

ZWrite Off

Blend SrcAlpha OneMinusSrcAlpha

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

fixed4 _Color;

sampler2D _MainTex;

float4 _MainTex_ST;

float _HorizontalAmount;

float _VerticalAmount;

float _Speed;

struct a2v {

float4 vertex : POSITION;

float2 texcoord : TEXCOORD0;

};

struct v2f {

float4 pos : SV_POSITION;

float2 uv : TEXCOORD0;

};

v2f vert (a2v v) {

v2f o;

//将顶点坐标转换到裁剪空间坐标系并且

o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

//o.texcoord = v.texcoord.xy *_MainTex_ST.xy+_MainTex_ST.zw

//将纹理坐标映射到顶点上以及zw偏移

o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

return o;

}

fixed4 frag (v2f i) : SV_Target {

float time = floor(_Time.y * _Speed);

float row = floor(time / _HorizontalAmount); // /运算获取当前行

float column = time - row * _HorizontalAmount; // %运算获取当前列

//首先把原纹理坐标i.uv按行数和列数进行等分,然后使用当前的行列进行偏移

half2 uv = i.uv + half2(column, -row);

uv.x /= _HorizontalAmount;

uv.y /= _VerticalAmount;

//纹理采样

fixed4 c = tex2D(_MainTex, uv);

c.rgb *= _Color;

return c;

}

ENDCG

}

}

//FallBack "Transparent/VertexLit"

}

效果:

滚动的背景

Shader "Unity Shaders Book/Chapter 11/Scrolling Background" {

Properties {

_MainTex ("Base Layer (RGB)", 2D) = "white" {}

_DetailTex ("2nd Layer (RGB)", 2D) = "white" {}

_ScrollX ("Base layer Scroll Speed", Float) = 1.0

_Scroll2X ("2nd layer Scroll Speed", Float) = 1.0

_Multiplier ("Layer Multiplier", Float) = 1

}

SubShader {

Tags { "RenderType"="Opaque" "Queue"="Geometry"}

Pass {

Tags { "LightMode"="ForwardBase" }

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

sampler2D _MainTex;

sampler2D _DetailTex;

float4 _MainTex_ST;

float4 _DetailTex_ST;

float _ScrollX;

float _Scroll2X;

float _Multiplier;

struct a2v {

float4 vertex : POSITION;

float4 texcoord : TEXCOORD0;

};

struct v2f {

float4 pos : SV_POSITION;

float4 uv : TEXCOORD0;

};

v2f vert (a2v v) {

v2f o;

//将顶点坐标从模型空间转换到裁剪空间

o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

将纹理坐标映射到顶点上以及zw偏移,并用ScrollX对x轴坐标进行偏移

o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex) + frac(float2(_ScrollX, 0.0) * _Time.y);

o.uv.zw = TRANSFORM_TEX(v.texcoord, _DetailTex) + frac(float2(_Scroll2X, 0.0) * _Time.y);

return o;

}

fixed4 frag (v2f i) : SV_Target {

//纹理采样

fixed4 firstLayer = tex2D(_MainTex, i.uv.xy);

fixed4 secondLayer = tex2D(_DetailTex, i.uv.zw);

//纹理混合

fixed4 c = lerp(firstLayer, secondLayer, secondLayer.a);

c.rgb *= _Multiplier;

return c;

}

ENDCG

}

}

FallBack "VertexLit"

}

效果:

顶点动画

效果:

Shader "Unity Shaders Book/Chapter 11/Water" {

Properties {

_MainTex ("Main Tex", 2D) = "white" {}

_Color ("Color Tint", Color) = (1, 1, 1, 1)

_Magnitude ("Distortion Magnitude", Float) = 1

_Frequency ("Distortion Frequency", Float) = 1

_InvWaveLength ("Distortion Inverse Wave Length", Float) = 10

_Speed ("Speed", Float) = 0.5

}

SubShader {

// Need to disable batching because of the vertex animation

Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True"}

Pass {

Tags { "LightMode"="ForwardBase" }

ZWrite Off

Blend SrcAlpha OneMinusSrcAlpha

Cull Off

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

sampler2D _MainTex;

float4 _MainTex_ST;

fixed4 _Color;

float _Magnitude;

float _Frequency;

float _InvWaveLength;

float _Speed;

struct a2v {

float4 vertex : POSITION;

float4 texcoord : TEXCOORD0;

};

struct v2f {

float4 pos : SV_POSITION;

float2 uv : TEXCOORD0;

};

v2f vert(a2v v) {

v2f o;

//顶点偏移量,只对x偏移

float4 offset;

offset.yzw = float3(0.0, 0.0, 0.0);

//Frequency控制频率f

//InvWaveLength控制波长L

//Magnitude控制幅度k

offset.x = sin(_Frequency * _Time.y + v.vertex.x * _InvWaveLength + v.vertex.y * _InvWaveLength + v.vertex.z * _InvWaveLength) * _Magnitude;

o.pos = mul(UNITY_MATRIX_MVP, v.vertex + offset);

//纹理采样

o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

//对v偏移,横向

o.uv += float2(0.0, _Time.y * _Speed);

return o;

}

fixed4 frag(v2f i) : SV_Target {

fixed4 c = tex2D(_MainTex, i.uv);

c.rgb *= _Color.rgb;

return c;

}

ENDCG

}

}

FallBack "Transparent/VertexLit"

}

效果:

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

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

相关文章

将excel转为python的字典_python读取excel表并把数据转存为字典

excel表如下:我们需要通过使用python的xlrd方法先读取excel,再遍历赋值给字典。代码如下: importxlrdclassRead_Ex():defread_excel(self):#打开excel表,填写路径 book xlrd.open_workbook("../Data/test.xlsx")#找到s…

linux中的改变bin级别,Linux常用命令

关机命令:shutdown -h now / shutdown -r now / reboot切换图形化界面:startx 切换到命令行:注销即可添加用户:useradd xiaoming设置密码:passwd xiaoming删除用户:userdel xiaoming 【userdel -r x…

pythonencoding etf-8_etf iopv python 代码30个Python常用小技巧

1、原地交换两个数字x, y 10, 20print(x, y)y, x x, yprint(x, y)10 2020 102、链状比较操作符n 10print(1 print(1 > n < 9)TrueFalse3、使用三元操作符来实现条件赋值[表达式为真的返回值] if [表达式] else [表达式为假的返回值]y 20x 9 if (y 10) else 8print(x…

micropython是啥 知乎_嵌入式开发必备调试工具:Micro-Lab

在工作中&#xff0c;以什么样的方式向领导汇报工作最直接高效呢&#xff1f;当然是图形界面&#xff01;图形界面更好表达一个程序设计的逻辑思维&#xff0c;一目了然&#xff0c;本次介绍的Micro-Lab出自风媒电子-赵工之手。 1.什么是Micro-Lab? Micro-Lab可以称得上是迄今…

win10树莓派改ip_Window 10通过网线和Wifi连接树莓派

几个月前买了个树莓派&#xff0c;扔在一边没有捣鼓&#xff0c;今天搞定了笔记本通过家里的wifi登录树莓派&#xff0c;下面列出设置过程。实验环境:网络&#xff1a;只有wifi材料&#xff1a;笔记本一台(Win10)&#xff0c;树莓派一台&#xff0c;EDUP USB无线网卡一枚&#…

双机通信c语言程序,双机通信(C语言、主机和从机共用程序)

//头文件#include//循环移位文件#define uchar unsigned char//宏定义#define uint unsigned intsbit key1P3^5; //位声明uchar code table[]{0X00,0x3f,0x06,0x5b,//数码管显示的数值0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar table_tr[6];//暂存最后按下的六个数值uchar…

python读取大文件目录_65.Python读取大文件

方式一 import os path r"C:\Users\yzt\Desktop\work\InfosecTestPlatform\libs\Log\mainline1-nohup.log" ##################### """ file.seek(off, whence0)&#xff1a; 从文件中移动off个操作标记&#xff08;文件指针&#xff09;&#xff0c…

java设计按月每天签到_java实现app签到功能

本文实例为大家分享了java实现app签到功能的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下1.首先设计二张表&#xff0c;第一张表sign_calc记录用户连续签到次数&#xff0c;字段id,user_id,continue_days&#xff0c;第二张表sign_detail签到详情表id,user_id,sign…

c语言第四版课后答案第三章3.4,算法与数据结构C语言版课后习题答案(机械工业出版社)第3,4章 习题参考答案...

第3章栈和队列一、基础知识题3.1 有五个数依次进栈&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。在各种出栈的序列中&#xff0c;以3&#xff0c;4先出的序列有哪几个。(&#xff13;在&#xff14;之前出栈)。【解答】34215 &#xff0c;34251&#x…

python面向对象三大基本特性_python面向对象之三大特性

继承 先看个简单的例子了解一下继承。class Animal: #父类 def __init__(self, name, age, department): self.namename self.ageage self.departmentdepartmentdefrunning(self):print(‘%s可以奔跑&#xff01;‘%self.name)class Cat(Animal): #括号里放要继承的父类 def __…

用python做透视表_用Python实现数据的透视表的方法

用Python实现数据的透视表的方法来源&#xff1a;中文源码网 浏览&#xff1a; 次 日期&#xff1a;2019年11月5日【下载文档: 用Python实现数据的透视表的方法.txt 】(友情提示:右键点上行txt文档名->目标另存为)用Python实现数据的透视表的方法在处理数据时&#x…

c语言编程用进退法求搜索区间代码,用c对函数进行优化的问题

//多维无约束优化软件设计#include #include #include double det1e-5; //计算精度double det11e-3; //梯度判断精度double ak3e-3; //搜索步长double dx1e-4; //梯度计算步长/*目标函数(n维)入口参数&#xff1a;x &#xff1a;n维数组&#xff0c;自变量返回值 &#xff1a;函…

python关闭指定浏览器页面_Python自动关闭浏览器关闭网页的方法

在py编辑窗口中输入代码&#xff1a; from selenium.webdriver.chrome.options import Options from selenium import webdriver __browser_url rC:\Users\Administrator\AppData\Roaming\360se6\Application\360se.exe chrome_options Options() chrome_options.binary_loca…

ubuntu 安装kde桌面_在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法

本文介绍在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法。Plasma Desktop是KDE创建的一种流行且功能强大的桌面环境&#xff0c;主要用于Linux系统。KDE Plasma的当前版本是5&#xff0c;它是KDE Plasma 4的后续版本&#xff0c;旨在帮助您以高效的方式完成工作。当Plasma强…

c语言将字母的acsaii,C语言上机实验 答案

《C语言上机实验 答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言上机实验 答案(31页珍藏版)》请在装配图网上搜索。1、实验一 上机操作初步(2学时)一、实验方式&#xff1a;一人一机二、实验目的&#xff1a;1、熟悉VC语言的上机环境及上机操作过程。2、了…

python怎么调用列表_Python中列表的使用

python中的列表与java中的数组非常类似&#xff0c;但使用方法比java中数组简单很多&#xff0c;python中的数据类型不需要显示声明&#xff0c;但在使用时必须赋值&#xff0c;列表元素下标从0开始 初始化列表&#xff08;初始化一个包含五个元素的列表和一个空列表&#xff0…

videowriter最小的编码格式_cv2.VideoWriter() 指定写入视频帧编码格式

今天用opencv保存的视频文件超级大&#xff0c;被小伙伴们嘲笑&#xff0c;哈哈&#xff0c;原来是视频帧编码格式导致的&#xff0c;这里记录下常用的保存视频编码格式。编码参数&#xff1a;cv2.VideoWriter_fourcc(‘I‘,‘4‘,‘2‘,‘0‘)---未压缩的YUV颜色编码&#xff…

C语言和JAVA可以互相转换吗,求助大神!!!JAVA转换成C语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//此处不要看&#xff0c;c应该内置了这个函数&#xff0c;不需要自定义Array.prototype.remove function(val) {var index this.indexOf(val);if (index > -1) {this.splice(index,1);}};//名称:获取当天上班的人//参数&…

windows消息队列C语言,08年计算机二级C语言辅导:vc操作微软消息队列的方法

定义IMSMQQueuePtr qDest; // Represents Destination QueueIMSMQQueueInfoPtr qInfo; //Represents an open instance of the destination queueIMSMQQueueInfoPtr qRead;IMSMQMessagePtr qMsg; //Represents the message初始化qDest NULL;CoInitialize(NULL);try{qInfo.Crea…

jwt重放攻击_【干货分享】基于JWT的Token认证机制及安全问题

一步一步教你基于JWT的Token认证机制实现&#xff0c;以及如何防范XSS攻击、Replay攻击和中间人攻击。文章目录一、几种常用的认证机制1.1 HTTP Basic AuthHTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password&#xff0c;简言之&#xff0c;Basic Auth…