0

嗨,Unity 开发人员,

我一直在尝试修改 Skybox/Cubemap 的内置 Unity 着色器,以便它需要第二个立方体贴图,并且在两者之间具有混合因子。

我尝试了以下着色器脚本,但是它没有产生预期的结果,有没有比我更了解着色器代码的人可以帮助我的学习/结果?我发现学习如何使用着色器代码非常困难,仅使用 Unity 大约 2-3 个月。

Shader "RenderFX/Skybox2" {
Properties {
    _Tint ("Tint Color", Color) = (.5, .5, .5, .5)
    [Gamma] _Exposure ("Exposure", Range(0, 8)) = 1.0
    _Rotation ("Rotation", Range(0, 360)) = 0
    _Rotation2 ("Rotation 2", Range(0, 360)) = 0
    _Blend ("Blend", Range (0, 1) ) = 0.5 
    [NoScaleOffset] _Tex ("Cubemap   (HDR)", Cube) = "grey" {}
    _Skybox2 ("Skybox two", Cube) = ""
}

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;
        half4 _Tex_HDR;
        half4 _Tint;
        half _Exposure;
        float _Rotation;

        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);
            half3 c = DecodeHDR (tex, _Tex_HDR);
            c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb;
            c *= _Exposure;
            return half4(c, 1);
        }
        ENDCG 
    }

    Pass {

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

        #include "UnityCG.cginc"

        samplerCUBE _Skybox2;
        half4 _Skybox2_HDR;
        half4 _Tint;
        half _Exposure;
        float _Rotation2;
        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, _Rotation2);
            o.vertex = UnityObjectToClipPos(rotated);
            o.texcoord = v.vertex.xyz;
            return o;
        }

        fixed4 frag (v2f i) : SV_Target
        {
            half4 tex = texCUBE (_Skybox2, i.texcoord);
            half3 c2 = DecodeHDR (tex, _Skybox2_HDR);
            c2 = c2 * _Tint.rgb * unity_ColorSpaceDouble.rgb;
            c2 *= _Exposure;
            return half4(c2, 1);
        }
        ENDCG 
    }

    Pass {
        SetTexture[c]
        SetTexture[c2] { 
            ConstantColor (0,0,0, [_Blend]) 
            Combine texture Lerp(constant) previous
        }       
    }
}   


Fallback Off

}

结果是一个灰色的视图,我认为我没有正确传递 c/c2 变量,或者即使它们可以像那样传递。我真的很困惑我如何才能达到这种效果。

混合通道仅适用于普通纹理,但我需要它来保持旋转值,而不仅仅是纹理。

在此先感谢您的着色器/Unity 专家!我希望有一天能加入你的行列。

4

0 回答 0