首页 > 其他分享 ># shader——无限循环背景的制作

# shader——无限循环背景的制作

时间:2023-03-03 16:44:46浏览次数:61  
标签:1.0 uvTA uv shader 无限 循环 v2f 顶点 speed

制作前准备

  1. 需求要求
    • UI中的一张图片需要无限制的斜向移动。
  2. 图片设置准备

开始制作

首先我们需要一个mainTexture的参数和调节速度的参数,所以我们在Properties块中定义2个属性,代码如下:

	Properties {
		_MainTex ("Main Texture", 2D) = "black" {}
		_speed ("speed", Range(0, 10)) = 0.5
	}

然后我们设立一个结构体v2f来存储转换位置后的数据,代码如下:

	struct v2f {
			float4 pos : SV_POSITION;
			half2 uvTA: TEXCOORD0;
		};

其中:
float4 pos : SV_POSITION 表示转换后的顶点位置,half2 uvTA: TEXCOORD0 表示转换后的顶点纹理坐标。

接着我们开始具体的转换,代码如下:

		v2f vert(appdata_img v) {
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
			o.uvTA = v.texcoord;
			return o;
		}

其中,appdata_img v 表示输入的顶点数据,包含了顶点的位置和纹理坐标等信息。v.vertex 表示顶点的位置,v.texcoord 表示顶点的纹理坐标。

mul(UNITY_MATRIX_MVP, v.vertex) 表示将顶点的位置乘以当前的模型视图投影矩阵(MVP 矩阵)进行转换,得到转换后的顶点位置。

最后,将转换后的顶点位置和纹理坐标打包成一个 v2f 结构体,并返回转换后的数据,进行uv偏移的操作,代码如下:

fixed4 frag(v2f i) : SV_Target {
			float2 uv = i.uvTA;
			uv.x -= _Time.y * _speed;
			uv.y -= _Time.y * _speed;
            if (uv.x > 1.0 || uv.y > 1.0) {
                uv.x -= 1.0;
            	uv.y -= 1.0;
            }
            if (uv.x < 0.0 || uv.y < 0.0) {
                uv.x += 1.0;
            	uv.y += 1.0;
            }
			return tex2D(_MainTex, uv).rgba ;
		}

最后实现的效果

因为是UI所以需要挂在画布下

效果Gif如下:

shader全部代码:

Shader "TUT/BackgroundLoop_P1" {
	Properties {
		_MainTex ("Main Texture", 2D) = "black" {}
		_speed ("speed", Range(0, 10)) = 0.5
	}
	SubShader {
		Tags {"Queue"="Transparent" }
		CGINCLUDE

		#include "UnityCG.cginc"

		sampler2D _MainTex;  
		uniform half4 _MainTex_ST;
		
		struct v2f {
			float4 pos : SV_POSITION;
			half2 uvTA: TEXCOORD0;
		};
		
		v2f vert(appdata_img v) {
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
			o.uvTA = v.texcoord;
			return o;
		}
		
		float _speed;
		fixed4 frag(v2f i) : SV_Target {
			float2 uv = i.uvTA;
			uv.x -= _Time.y * _speed;
			uv.y -= _Time.y * _speed;
            if (uv.x > 1.0 || uv.y > 1.0) {
                uv.x -= 1.0;
            	uv.y -= 1.0;
            }
            if (uv.x < 0.0 || uv.y < 0.0) {
                uv.x += 1.0;
            	uv.y += 1.0;
            }
			return tex2D(_MainTex, uv).rgba ;
		}
		    
		ENDCG
		Pass {
			Blend SrcAlpha OneMinusSrcAlpha
			CGPROGRAM
			  
			#pragma vertex vert  
			#pragma fragment frag

			ENDCG  
		}
		}
	FallBack "Diffuse"
}

引用:

[Unity+shader]无限循环背景的制作

标签:1.0,uvTA,uv,shader,无限,循环,v2f,顶点,speed
From: https://www.cnblogs.com/948245132ljx/p/17175970.html

相关文章

  • shadertoy学习 第一课
    一、坐标归一化voidmainImage(outvec4fragColor,invec2fragCoord){   //Normalizedpixelcoordinates(from0to1)    vec2uv=fragCoord/iResolut......
  • Ubuntu20.04修改环境变量失误导致开机循环——解决方法以及保存profile
    gedit/etc/profile配置Ubuntu环境变量时出现失误导致开机时输入密码后重复开机无法进入图画界面解决方法:ctrl+alt+(F1~F6),我的是ctrl+alt+F2进入界面输入login(用户名)和......
  • 【python】pandas 循环输出结果
    1.dataframe-->dictimportpandasaspddf=pd.read_csv(file_path,sep=sep)#sep:间隔字符df.to_dict(orient='dict')#默认dict#{'time':{0:"-3'",1:......
  • 数据结构之单向不循环链表
    链表是一种物理存储结构上非连续、非顺序的线性存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表中的元素(节点)中记录了与其他元素的连接关系,链表的存储方......
  • 纯js实现图片无缝循环走马灯效果支持拖拽和惯性滑动
    要求实现一个无缝循环的图片滚动公告,支持上下,左右模式。要求1,不可有卡顿图片无缝轮播     2,手指拖拽暂停轮播,用户可左右(或上下)拖拽,快速滑动有惯性效果。 ......
  • java - for 循环15
    packagecom.demo.test;publicclasscirculate{publicstaticvoidmain(String[]args){System.out.println();f();}publicstat......
  • 直播系统源码,云朵左右移动循环动画实现
    直播系统源码,云朵左右移动循环动画实现组件 <imageclass="yun3aniYunImg":animation="animationYunData":src="yun1"></image>​JS data(){return{   ......
  • 新手:python里面while循环2——代码优化
    上一笔记里面,有大量重复的代码,这次来进行优化,如果有其他方法,请教教我,respect!点击查看代码#-*-coding:utf-8-*-#__author:AndyLiu#Date:2023/3/2menu={......
  • 流程控制-循环结构
    1、LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用LEAVE子句),跳出循环过程。 基础语法[loop_label:]LOOP循环执行的语......
  • C语言循环队列实现
    typedefstruct{int*arr;intfront;inttail;intsize;}MyCircularQueue;MyCircularQueue*myCircularQueueCreate(intk){MyCircularQ......