forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Эффекты/Шейдеры (http://forum.boolean.name/forumdisplay.php?f=170)
-   -   Аналог стандартного Terrain шейдера (http://forum.boolean.name/showthread.php?t=20679)

Evgen 06.01.2018 18:16

Аналог стандартного Terrain шейдера
 
Взял за основу FourSplit и хотелось бы чтобы все 4 слоя поддерживали Tiling и Offset. Собственно сам шейдер:

Код:

    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
       
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard
 
        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 2.0
 
        sampler2D _TileTextureR;
        sampler2D _TileTextureG;
        sampler2D _TileTextureB;
        sampler2D _TileTextureA;
        sampler2D _BlendTex;
 
        struct Input {
            float2 uv_TileTextureR;
            float2 uv_TileTextureG;
            float2 uv_TileTextureB;
            float2 uv_TileTextureA;
            float2 uv_BlendTex;
        };
 
        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 blend = tex2D(_BlendTex, IN.uv_BlendTex);
            fixed4 c =
                tex2D(_TileTextureR, IN.uv_TileTextureR) * blend.r +
                tex2D(_TileTextureG, IN.uv_TileTextureG) * blend.g +
                tex2D(_TileTextureB, IN.uv_TileTextureB) * blend.b +
                tex2D(_TileTextureA, IN.uv_TileTextureB) * abs(1 - blend.a);
            o.Albedo = c.rgb;
        }
        ENDCG
    }

Стоит заменить

Код:

tex2D(_TileTextureA, IN.uv_TileTextureB) * abs(1 - blend.a);
на

Код:

tex2D(_TileTextureA, IN.uv_TileTextureA) * abs(1 - blend.a);
Выходит ошибка:
"Too many texture interpolations ... (11 out of max 10)"

В шейдерах не силен, что в коде нужно исправить, чтобы обойти это ограничение?

Evgen 06.01.2018 22:11

Ответ: Аналог стандартного Terrain шейдера
 
Кое что откопал:

https://docs.unity3d.com/Manual/SL-ShaderSemantics.html

Цитата:

Сообщение от docs.unity3d.com
Interpolator count limits

There are limits to how many interpolator variables can be used in total to pass the information from the vertex into the fragment shader. The limit depends on the platform and GPU, and the general guidelines are:

Up to 8 interpolators: OpenGL ES 2.0 (iOS/Android), Direct3D 11 9.x level (Windows Phone) and Direct3 9 shader model 2.0 (old PCs). Since the interpolator count is limited, but each interpolator can be a 4-component vector, some shaders pack things together to stay within limits. For example, two texture coordinates can be passed in one float4 variable (.xy for one coordinate, .zw for the second coordinate).
Up to 10 interpolators: Direct3D 9 shader model 3.0 (#pragma target 3.0).
Up to 16 interpolators: OpenGL ES 3.0 (iOS/Android), Metal (iOS).
Up to 32 interpolators: Direct3D 10 shader model 4.0 (#pragma target 4.0).

Regardless of your particular target hardware, it is generally a good idea to use as few interpolators as possible for performance reasons.


Mr_F_ 07.01.2018 00:47

Ответ: Аналог стандартного Terrain шейдера
 
Юнити трансформирует все эти uv_ в вертексном шейдере и передаёт в пиксельный, и ты не влезаешь в количество передаваемых данных. Можно пойти другим путём - объявить свои собственные Vector4 параметры тайлинга/оффсета и плющить ими одинаковые uv внутри surf функции (типа IN.дефолтныеUv * tilingOffsetR.xy + tilingOffsetR.zw).
Это может быть мизерно медленнее, чем в вертексном, но должно работать и влезать.

Evgen 07.01.2018 16:31

Ответ: Аналог стандартного Terrain шейдера
 
Впрочем к чему эта морока, скачал стандартный Nature/Terrain/Diffuse с официального сайта, можно использовать... Запустил работает. Единственное немного запнулся с цветами текстуры маски Terrain.

В экспериментах. Для извлечения текстуры маски из готового Terrain в png использовал инструмент:
https://mattgadient.com/2014/09/28/u...tmap-to-a-png/


Часовой пояс GMT +4, время: 16:04.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot