Unity 自定义天空盒,如 Unity 天空盒

Posted

技术标签:

【中文标题】Unity 自定义天空盒,如 Unity 天空盒【英文标题】:Unity custom skybox like Unity skybox 【发布时间】:2017-09-13 18:29:23 【问题描述】:

我正在尝试为 360 图像做一个自定义天空盒,它有 2 个带有淡入淡出的纹理,我需要它来响应旋转值,如 Unity Skybox。我只需要相同的滑块,但我没有任何运气,我对着色器完全陌生。

这是我到现在为止的代码

Shader "Custom/fundido"

   Properties 

     _Blend ("Blend", Range (0, 1) ) = 0.0
     _Rotation ("Rotation", Range(0, 360)) = 0
     _BaseTexture ("Cubemap (HDR)", Cube) = "grey" 
     _OverlayTexture ("Cubemap2 (HDR)", Cube) = "grey" 

 

SubShader 

 Tags  "Queue"="Background" "RenderType"="Background" 
"PreviewType"="Skybox" 

Pass 

         SetTexture[_BaseTexture]
         SetTexture[_OverlayTexture] 
         ConstantColor (0,0,0, [_Blend]) 
         combine texture Lerp(constant) previous
         
     
 
 

_Blend 非常适合交叉淡入淡出,我只需要添加 Rotation 监听器。

非常感谢!!!

【问题讨论】:

看看这个链接:forum.unity.com/threads/rotate-a-skybox.130639,但不是通过脚本更改旋转,而是使用滑块_Rotation 属性进行更改。 你好东姑!谢谢你这么快。我尝试了那个帖子,两个相机的技巧做了一些修改,但是当我将陀螺仪控制连接到主相机时,给了我一些奇怪的轴运动。正如您所说,最好的方法是使用我的滑块,但它没有连接到任何东西,因为我不知道如何将它附加到着色器。这就是我想要做的,将我的滑块添加到我为交叉淡入淡出所拥有的着色器中。谢谢:) 嗨,我刚到家。我设法创建了着色器,它对我有用,经过一些清理后,我会给你一个答案。 【参考方案1】:

这里是着色器。您可以通过脚本改变一天的周期。 https://docs.unity3d.com/ScriptReference/Material.SetFloat.html

Shader "TFTM/Skybox2CubeBlend" 
Properties 
    _Blend ("Blend", Range (0, 1) ) = 0.0
    _Rotation ("Rotation", Range(0, 360)) = 0
    _Tex ("Cubemap   (HDR)", Cube) = "grey" 
    _OverlayTex ("CubemapOverlay (HDR)", Cube) = "grey" 


SubShader 
    Tags  "Queue"="Background" "RenderType"="Background" "PreviewType"="Skybox" 
    Cull Off ZWrite Off

    Pass 

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma target 2.0

        #include "UnityCG.cginc"

        samplerCUBE _Tex;
        samplerCUBE _OverlayTex;
        half4 _Tex_HDR;
        half4 _Tint;
        half _Exposure;
        float _Rotation;
        float _Blend;

        float3 RotateAroundYInDegrees (float3 vertex, float degrees)
        
            float alpha = degrees * UNITY_PI / 180.0;
            float sina, cosa;
            sincos(alpha, sina, cosa);
            float2x2 m = float2x2(cosa, -sina, sina, cosa);
            return float3(mul(m, vertex.xz), vertex.y).xzy;
        

        struct appdata_t 
            float4 vertex : POSITION;
        ;

        struct v2f 
            float4 vertex : SV_POSITION;
            float3 texcoord : TEXCOORD0;
        ;

        v2f vert (appdata_t v)
        
            v2f o;
            float3 rotated = RotateAroundYInDegrees(v.vertex, _Rotation);
            o.vertex = UnityObjectToClipPos(rotated);
            o.texcoord = v.vertex.xyz;
            return o;
        

        fixed4 frag (v2f i) : SV_Target
        
            half4 tex = texCUBE (_Tex, i.texcoord);
            half4 tex2 = texCUBE (_OverlayTex, i.texcoord);
            float4 env = lerp( tex, tex2, _Blend );

            half3 c = DecodeHDR (env, _Tex_HDR);

            return half4(c, 1);
        
        ENDCG 
    
   
Fallback Off


【讨论】:

哇!太棒了,非常感谢!你知道开始学习着色器的好文档吗?我想了解他们以应对未来的问题。真的再次感谢:D 我个人非常喜欢 Alan Zucconi 着色器书。 alanzucconi.com/books 谢谢东姑希望我能报答。 :D 当然,看看我的 github,我创建的着色器很少。可能对你有帮助。 github.com/TengkuFathullah ,您可以将答案投票为有用的,因此它会在顶部列表中。如果您需要更多好的参考,请给我留言。

以上是关于Unity 自定义天空盒,如 Unity 天空盒的主要内容,如果未能解决你的问题,请参考以下文章

unity 中怎样设置动态天空盒,让天空盒上的云动起来

小功能⭐️Unity动态更换天空盒旋转天空盒

unity怎么不让天空盒子的太阳反射到地面太难看

unity3d怎么在脚本里面更改天空盒

Unity 实战项目 ☀️| Unity实现 天空盒 轮播系列切换

unity切换天空盒 地面倒影