滚动的背景 Shader

TA 滚动的背景 ShaderLab

参考冯乐乐《Shader入门精要》

frac()函数是取浮点数的小数部分的,它的图像是这样的
在这里插入图片描述
然后下面还用到了lerp函数,这个函数大家应该挺熟悉的就是下面这个

float lerp(a, b, c){
	return (1- c)*a + c*b;
}

好,下面就是Subshader部分

SubShader
    {
        Tags { "Queue"="Transparent" }
        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 i){
                v2f o;
                o.pos = UnityObjectToClipPos(i.vertex);
                // 这个就是让第一章贴图在x轴上随时间进行循环偏移
                o.uv.xy = TRANSFORM_TEX(i.texcoord, _MainTex)
                +frac(float2(_ScrollX,0)*_Time.y);
                // 这个就是让第二章贴图在x轴上随时间进行循环偏移
                o.uv.zw = TRANSFORM_TEX(i.texcoord, _DetailTex)+
                 frac(float2(_Scroll2X,0)*_Time.y);
                return o;
            }

            fixed4 frag(v2f i):SV_TARGET
            {
                fixed4 col01 = tex2D(_MainTex, i.uv.xy);
                fixed4 col2 = tex2D(_DetailTex, i.uv.zw );
                //将两张图片进行混合
                fixed4 col = lerp(col2,col01 , col01.a);
                // 调整整体颜色亮度
                col *= _Multiplier;
                return col;
            }
            ENDCG
        }

这里面稍微难理解点的可能就这句了

fixed4 col = lerp(col2,col01 , col01.a);

这个就是当col01 输出的某个部分的透明度如果为0 ,则不输出这时就会只输出另一张图,如果为1 则col01遮挡住col2, 这样就形成了一个层级的视觉效果了

下面是效果图
在这里插入图片描述

### Unity 中实现滚动背景效果的方法 在 Unity 中实现滚动背景的效果可以通过多种方式完成,其中一种常见的方式是利用 **Shader Graph** 和脚本来控制纹理的平移。以下是具体方法: #### 使用 Shader Graph 实现滚动背景 通过 `Sample Texture 2D` 节点可以在 Shader Graph 中实现 UI 或场景中的滚动背景。 1. 创建一个新的 Shader Graph 文件并打开它。 2. 在 Shader Graph 编辑器中右键单击空白区域,选择 `Create Node -> Sample Texture 2D` 来创建一个采样节点[^1]。 3. 将需要滚动的纹理拖拽至该节点作为输入纹理。 4. 定义一个时间变量用于驱动滚动效果。为此,在 Master Stack 上添加一个 Time 输入节点,并将其连接到 UV 坐标的偏移量上。 5. 设置 UV 的 X 或 Y 方向上的偏移值来模拟水平或垂直方向的滚动效果。 最终得到的是基于 GPU 计算的高效滚动背景解决方案。 ```csharp // 示例代码展示如何动态调整材质属性以影响滚动速度 public class BackgroundScroll : MonoBehaviour { public Material material; // 关联到使用了自定义着色器的对象材料 private float scrollSpeedX = 0.1f; void Update() { Vector2 offset = new Vector2(Time.time * scrollSpeedX, 0); material.SetTextureOffset("_MainTex", offset); } } ``` #### 利用 Rigidbody 控制背景移动 另一种更简单的做法就是直接操作游戏对象的位置变化。这种方法适合于不需要复杂视觉特效的情况。 1. 给背景图片附加一个 Rigidbody 组件并将它的运动模式设置成 Kinematic[^2]。 2. 修改 GameControl 单例类里的逻辑部分,增加对于背景位移更新的支持。 ```csharp using UnityEngine; public class GameControl : MonoBehaviour { public static GameControl Instance { get; private set; } [SerializeField] private GameObject backgroundPrefab; [SerializeField] private float moveSpeed = -5f; private Transform cameraTransform; void Awake() => Instance = this; void Start() { SpawnBackground(); cameraTransform = Camera.main.transform; } void FixedUpdate() { MoveBackgrounds(); } void MoveBackgrounds() { foreach (var bg in FindObjectsOfType<GameObject>()) if(bg.CompareTag("Background")) bg.transform.position += Vector3.right * moveSpeed * Time.fixedDeltaTime; } void SpawnBackground(){} } ``` 以上两种技术都可以用来制作连续循环播放或者一次性线性前进类型的卷轴式背景画面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值