《Unity Shader》11.2.2 滚动的背景

(1)新建一个场景,在本书资源中,该场景名为Scene_11_2_2。在Unity 5.2中,默认情况下场景将包含一个摄像机和一个平行光,并且使用了内置的天空盒子。在Window → Lighting →Skybox中去掉场景中的天空盒子。由于本例模拟的是2D游戏中的滚动背景,因此我们需要把摄像机的投影模式设置为正交投影。

(2)新建一个材质。在本书资源中,该材质名为ScrollingBackgroundMat。

(3)新建一个Unity Shader。在本书资源中,该Shader名为Chapter11-ScrollingBackground。把新的Shader赋给第2步中创建的材质。

(4)在场景中创建一个四边形(Quad),调整它的位置和大小,使它充满摄像机的视野范围,然后把第2步中的材质拖曳给它。该四边形将用于显示游戏背景。

打开新建的Chapter11-ScrollingBackground,删除原有的代码,并添加如下关键代码。

(1)我们首先声明了新的属性:

(2)我们的顶点着色器代码非常简单:

(3)片元着色器的工作就相对比较简单:

(4)最后,我们把Fallback设置为内置的VertexLit(也可以选择关闭Fallback):

保存后返回场景,把本书资源中的Assets/Textures/Chapter11/Far_Background.png和Assets/Textures/Chapter11/Near_Background.png分别赋给材质的Base Layer和2nd Layer属性,并调整它们的滚动速度(由于我们想要在视觉上模拟Base Layer比2nd Layer更远的效果,因此Base Layer的滚动速度要比2nd Layer的速度慢一些)。单击运行后,就可以得到类似图11.3中的效果。

https://github.com/candycat1992/Unity_Shaders_Book/blob/master/Assets/Shaders/Chapter11/Chapter11-ScrollingBackground.shader

cs 复制代码
Shader "Custom/Chapter11-ScrollingBackground"
{
    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); 
                o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex) + frac(float2(_ScrollX, 0.0) * _Time.y); //利用TRANSFORM_TEX来得到初始的纹理坐标,_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); //使用第二层纹理的透明通道来混合两张纹理,这使用了CG的lerp函数
                c.rgb *= _Multiplier; //使用_Multiplier参数和输出颜色进行相乘,以调整背景亮度。
                return c;
            }
            ENDCG
        }
    }
    FallBack "VertexLit"
}

https://github.com/candycat1992/Unity_Shaders_Book/blob/master/Assets/Textures/Chapter11/far_background.png

https://github.com/candycat1992/Unity_Shaders_Book/blob/master/Assets/Textures/Chapter11/near_background.png

《Unity Shader》11.2.2 滚动的背景

相关推荐
小拉达不是臭老鼠2 小时前
Unity中的UI系统之UGUI
学习·ui·unity
万兴丶2 小时前
Coplay适用于 Unity 的“Al 代理”使用指南
unity·游戏引擎·ai编程
魔士于安5 小时前
Unity材质球大合集
unity·游戏引擎·材质
mxwin6 小时前
Unity Shader 冰面 Shader 制作原理与流程
unity·游戏引擎·shader
玖玥拾7 小时前
Cocos学习笔记:关卡系统、音频管理与物理控制
游戏引擎·cocos2d
小拉达不是臭老鼠8 小时前
Unity中的UI系统之UGUI_登陆面板实现
ui·unity
郝学胜-神的一滴8 小时前
[简化版 GAMES 101] 计算机图形学 11:频域·卷积·抗锯齿
c++·unity·图形渲染·opengl·three·unreal
玖玥拾17 小时前
Cocos学习笔记:滚动视图、关卡系统与本地存储
游戏引擎·cocos2d
元气少女小圆丶1 天前
SenseGlove Nova 2+Unity开发笔记2
笔记·unity·游戏引擎
Oiiouui1 天前
Godot(4.x): 游戏管理器: Godot 内注入数据处理与总接口实现
游戏·游戏引擎·godot