Можно ли избежать растягивания вертикальной текстуры с помощью этого шейдера Unity? - PullRequest
0 голосов
/ 16 января 2019

Я работаю над созданием динамической карты мира и использую текстурный массив Unity, чтобы сделать его основой текстуры. Тем не менее, у шейдера у меня в настоящее время плитки хорошо на x / z, но сильно растягивается на y. Есть ли способ исправить это так, чтобы он располагался на всех трех осях?

Shader "Custom/TerrainTexture" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Terrain Texture", 2DArray) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.5

        UNITY_DECLARE_TEX2DARRAY(_MainTex);

        struct Input {
            float4 color : COLOR;
            float3 worldPos;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            float2 uv = IN.worldPos.xz * 0.20;
            fixed4 c = UNITY_SAMPLE_TEX2DARRAY(_MainTex, float3(uv, 1));
            o.Albedo = c.rgb * _Color;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

1 Ответ

0 голосов
/ 16 января 2019

Для этого вам нужно трипланарное картирование. Принцип заключается в том, что вы проецируете текстуру на плоскость XZ, как вы это делали, но затем вы также проецируете ее на плоскости ZY и XY. Наконец, вы используете нормаль поверхности (обычно квадрат многократно), чтобы смешать текстуры (умножить и сложить).

Вот как выглядит функция смешивания:

inline float3 TriplanarBlendFactor(half3 normal) {
    float3 bf = pow(abs(normal), 6);
    bf /= dot(bf, (float3)1);
    return bf;
}

Затем просто объедините образцы текстур так:

fixed4 cx = tex2D(tex, tx) * blendFactor.x;
fixed4 cy = tex2D(tex, ty) * blendFactor.y;
fixed4 cz = tex2D(tex, tz) * blendFactor.z;
fixed4 finalColor = cx + cy + cz;

Вы можете выставить мощность в функции смешивания как свойство шейдера, если вы хотите контролировать расстояние смешивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...