《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 滚动的背景

相关推荐
叶帆6 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君6 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子7 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai3152475437 天前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
心前阳光7 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光7 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯7 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案7 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔7 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
鼎艺创新科技7 天前
三维电子沙盘中OSGB倾斜摄影数据的加载与渲染
游戏引擎·cocos2d