Как согнуть объект шейдерами в Unity? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть шейдерный скрипт, с помощью которого я сгибаю мир.Но проблема в том, что этот скрипт только наклоняется вверх и вниз.Как добавить, чтобы можно было как влево, так и вправо?

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Custom/Bendy Diffuse - Radial" 
{
    Properties 
    {
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _ReflectionColor ("Reflection Tint Color", Color) = (1,1,1,1)
    }

    SubShader 
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert vertex:vert addshadow
        #pragma multi_compile __ HORIZON_WAVES 
        #pragma multi_compile __ BEND_ON

        // Global properties to be set by BendControllerRadial script
        uniform half3 _CurveOrigin;
        uniform fixed3 _ReferenceDirection;
        uniform half _Curvature;
        uniform fixed3 _Scale;
        uniform half _FlatMargin;
        uniform half _HorizonWaveFrequency;

        // Per material properties
        sampler2D _MainTex;
        fixed4 _Color;
        fixed4 _ReflectionColor;

        struct Input 
        {
            float2 uv_MainTex;
        };

        half4 Bend(half4 v)
        {
            half4 wpos = mul (unity_ObjectToWorld, v);

            half2 xzDist = (wpos.xz - _CurveOrigin.xz) / _Scale.xz;

            half dist = length(xzDist);
            fixed waveMultiplier = 1;

            dist = max(0, dist - _FlatMargin);

            wpos.y -= dist * dist * _Curvature * waveMultiplier;

            wpos = mul (unity_WorldToObject, wpos);

            return wpos;
        }

        void vert (inout appdata_full v) 
        {
            #if defined(BEND_ON)
            v.vertex = Bend(v.vertex);  
            #endif
        }

        void surf (Input IN, inout SurfaceOutput o) 
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;

            fixed4 detail = tex2D(_MainTex, IN.uv_MainTex);
            fixed4 refl = tex2D(_MainTex, IN.uv_MainTex);

            o.Albedo = detail.rgb * _Color.rgb;
            o.Alpha = 1;
            o.Emission = refl.rgb * _ReflectionColor.rgb;
        }
        ENDCG

    }

    Fallback "Mobile/Specular/Diffuse"
}

1 Ответ

0 голосов
/ 31 октября 2018

Если я правильно понял ваш вопрос, вы пытаетесь создать иллюзию искривленной Земли. У вас есть xzDist, добавьте этот вектор, умноженный на неизмененный Y. Таким образом, в основном, если он остался от начальной точки, согните его влево. Высокие точки будут больше отклоняться от центра, а те, что ниже экватора, могут наклоняться к центру. Не могу обещать, что это будет выглядеть правильно.

...