Unity混合天空盒

对于不同天气下天空盒的实现。

天空盒时通过天空盒材质更改实现的,新建材质,选择shader/skybox/6sided,然后添加六个天空盒贴图就可以实现天空盒,如果想实现天气变化则需要至少两套贴图,并需要实现渐变。此时需要新建着色器shader。Create/shader/unityshader然后双击新建的shader,添加如下代码,然后将此shader添加到相应材质上,就会看到相应材质有12个贴图槽,即两套天空盒贴图,拖入相应的贴图,通过材质的setfloat方法控制参数_Blend的值即可实现渐变,如第二段代码所示,也可加入灯光强度的设置,以达到相关效果。

Shader "Skybox/Blended" {
    Properties{
        _Tint("Tint Color", Color) = (.5, .5, .5, .5)
        _Blend("Blend", Range(0.0,1.0)) = 0.5
        _FrontTex("Front (+Z)", 2D) = "white" {}
    _BackTex("Back (-Z)", 2D) = "white" {}
    _LeftTex("Left (+X)", 2D) = "white" {}
    _RightTex("Right (-X)", 2D) = "white" {}
    _UpTex("Up (+Y)", 2D) = "white" {}
    _DownTex("Down (-Y)", 2D) = "white" {}
    _FrontTex2("2 Front (+Z)", 2D) = "white" {}
    _BackTex2("2 Back (-Z)", 2D) = "white" {}
    _LeftTex2("2 Left (+X)", 2D) = "white" {}
    _RightTex2("2 Right (-X)", 2D) = "white" {}
    _UpTex2("2 Up (+Y)", 2D) = "white" {}
    _DownTex2("2 Down (-Y)", 2D) = "white" {}
    }

        SubShader{
        Tags{ "Queue" = "Background" }
        Cull Off
        Fog{ Mode Off }
        Lighting Off
        Color[_Tint]
        Pass{
        SetTexture[_FrontTex]{ combine texture }
        SetTexture[_FrontTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous }
    }
        Pass{
        SetTexture[_BackTex]{ combine texture }
        SetTexture[_BackTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous }
    }
        Pass{
        SetTexture[_LeftTex]{ combine texture }
        SetTexture[_LeftTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous }
    }
        Pass{
        SetTexture[_RightTex]{ combine texture }
        SetTexture[_RightTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous }
    }
        Pass{
        SetTexture[_UpTex]{ combine texture }
        SetTexture[_UpTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous }
    }
        Pass{
        SetTexture[_DownTex]{ combine texture }
        SetTexture[_DownTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous }
    }
    }

        Fallback "Skybox/6 Sided", 1
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SetWeather : MonoBehaviour {

    public Material sky;
    public Light sun;

    private float cloudValue = 0f;
    private float sunIntensity;

    private void SetOvercast(float value)
    {
        sky.SetFloat("_Blend", value);
       // sun.intensity = sunIntensity - (sunIntensity * value);
    }
    // Use this for initialization
    void Start () {
        sunIntensity = sun.intensity;
    }
    
    // Update is called once per frame
    void Update () {
        SetOvercast(cloudValue);
        cloudValue += 0.005f;
    }
}

 

posted @ 2017-10-16 22:55  81192  阅读(1496)  评论(0编辑  收藏  举报