Туман не покрывает траву с шейдером движения от ветра

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Туман не покрывает траву с шейдером движения от ветра

Сообщение blackrid 31 окт 2019, 10:54

Добрый день!
Я только начал разбираться с шейдерами, поэтому прошу помощи.
У меня на сцене трава и деревья, которые колышутся от ветра. Шейдер я взял тут:
[url]https://ru.stackoverflow.com/questions/945023/Деформация-анимация-картинки-на-unity[/url]

Текст шейдера:
Синтаксис:
Используется csharp
Shader "wind"
{
        Properties
        {
                [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
                _Color ("Tint", Color) = (1,1,1,1)
                [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        }

        SubShader
        {
                Tags
                {
                        "Queue"="Transparent"
                        "IgnoreProjector"="True"
                        "RenderType"="Transparent"
                        "PreviewType"="Plane"
                        "CanUseSpriteAtlas"="True"
                }

                Cull Off
                Lighting Off
                ZWrite Off
                Blend One OneMinusSrcAlpha

                Pass
                {
                CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #pragma multi_compile _ PIXELSNAP_ON
                        #include "UnityCG.cginc"
                       
                        struct appdata_t
                        {
                                float4 vertex   : POSITION;
                                float4 color    : COLOR;
                                float2 texcoord : TEXCOORD0;
                        };

                        struct v2f
                        {
                                float4 vertex   : SV_POSITION;
                                fixed4 color    : COLOR;
                                float2 texcoord  : TEXCOORD0;
                        };
                       
                        fixed4 _Color;

                        v2f vert(appdata_t IN)
                        {
                                v2f OUT;
                                OUT.vertex = UnityObjectToClipPos(IN.vertex);
                                OUT.texcoord = IN.texcoord;
                                OUT.color = IN.color * _Color;
                                #ifdef PIXELSNAP_ON
                                OUT.vertex = UnityPixelSnap (OUT.vertex);
                                #endif

                                return OUT;
                        }

                        sampler2D _MainTex;
                        sampler2D _AlphaTex;
                        float _AlphaSplitEnabled;

                        fixed4 SampleSpriteTexture (float2 uv)
                        {
                                uv.x;
                                fixed4 color = tex2D (_MainTex, uv);

#if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
                                if (_AlphaSplitEnabled)
                                        color.a = tex2D (_AlphaTex, uv).r;
#endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED

                                return color;
                        }

                        fixed4 frag(v2f IN) : SV_Target
                        {
                                IN.texcoord.x += _SinTime.a*0.05*IN.texcoord.y;
                                fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
                                c.rgb *= c.a;
                                return c;
                        }
                ENDCG
                }
        }
}
 


Все работает, листва шевелится. Но теперь на нее не действует туман. Что делать?

Изображение
blackrid
UNец
 
Сообщения: 6
Зарегистрирован: 19 окт 2019, 23:44

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение blackrid 31 окт 2019, 11:21

Вопрос снят, нашел решение )
Вот полный текст шейдера анимации растительности, кому надо:

Синтаксис:
Используется csharp
Shader "wind"
{
        Properties
        {
                [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
                _Color("Tint", Color) = (1,1,1,1)
                [MaterialToggle] PixelSnap("Pixel snap", Float) = 0
        }

                SubShader
                {
                        Tags
                        {
                                "Queue" = "Transparent"
                                "IgnoreProjector" = "True"
                                "RenderType" = "Transparent"
//                              "RenderType" = "Opaque"
                                "PreviewType" = "Plane"
                                "CanUseSpriteAtlas" = "True"
                        }

                        Cull Off
                        Lighting Off
                        ZWrite Off
                        Blend One OneMinusSrcAlpha

                        Pass
                        {
                        CGPROGRAM
                                #pragma vertex vert
                                #pragma fragment frag
                                #pragma multi_compile _ PIXELSNAP_ON
                                #pragma multi_compile_fog
                                #include "UnityCG.cginc"

                                struct appdata_t
                                {
                                        float4 vertex   : POSITION;
                                        float4 color    : COLOR;
                                        float2 texcoord : TEXCOORD0;
                                };

                                struct v2f
                                {
                                        float4 vertex   : SV_POSITION;
                                        fixed4 color : COLOR;
                                        float2 texcoord  : TEXCOORD0;
                                        UNITY_FOG_COORDS(1)
                                };

                                fixed4 _Color;

                                v2f vert(appdata_t IN)
                                {
                                        v2f OUT;
                                        OUT.vertex = UnityObjectToClipPos(IN.vertex);
                                        OUT.texcoord = IN.texcoord;
                                        OUT.color = IN.color * _Color;
                                        #ifdef PIXELSNAP_ON
                                        OUT.vertex = UnityPixelSnap(OUT.vertex);
                                        #endif
                                        UNITY_TRANSFER_FOG(OUT, OUT.vertex);

                                        return OUT;
                                }

                                sampler2D _MainTex;
                                sampler2D _AlphaTex;
                                float _AlphaSplitEnabled;

                                fixed4 SampleSpriteTexture(float2 uv)
                                {
                                        uv.x;
                                        fixed4 color = tex2D(_MainTex, uv);

        #if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
                                        if (_AlphaSplitEnabled)
                                                color.a = tex2D(_AlphaTex, uv).r;
        #endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED

                                        return color;
                                }

                                fixed4 frag(v2f IN) : SV_Target
                                {
                                        IN.texcoord.x += _SinTime.a * 0.05 * IN.texcoord.y;
                                        fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;

                                        UNITY_APPLY_FOG(IN.fogCoord, c);

                                        c.rgb *= c.a;

                                        return c;
                                }
                        ENDCG
                        }
                }
}
 


Но возникла другая проблема - растительность не реагирует на внешнее освещение. Пробовал прописать Lighting On, но не помогает.
blackrid
UNец
 
Сообщения: 6
Зарегистрирован: 19 окт 2019, 23:44

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение blackrid 12 ноя 2019, 14:45

Жаль, что никто так и не ответил. Слава богу, я нашел подходящий шейдер, который работает, как надо:
http://josemariaolea.com/create-grass-with-wind-effect-in-unity/

Синтаксис:
Используется csharp
Shader "Custom/WindGrass" {
Properties {
// Surface shader parameters
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
 
// Wind effect parameteres
_WindFrecuency("Wind Frecuency",Range(0.001,100)) = 1
_WindStrength("Wind Strength", Range( 0, 2 )) = 0.3
_WindGustDistance("Distance between gusts",Range(0.001,50)) = .25
_WindDirection("Wind Direction", vector) = (1,0, 1,0)
 
}
SubShader {
Tags { "Queue"="Transparent"
"RenderType"="TransparentCutout"
}
LOD 200
 
CGPROGRAM
 
#pragma surface surf Standard vertex:vert alpha:fade
//#pragma target 3.0
 
sampler2D _MainTex;
 
struct Input {
float2 uv_MainTex;
};
 
half _Glossiness;
half _Metallic;
fixed4 _Color;
 
half _WindFrecuency;
half _WindGustDistance;
half _WindStrength;
float3 _WindDirection;
 
// our vert modification function
void vert( inout appdata_full v )
{
float4 localSpaceVertex = v.vertex;
// Takes the mesh's verts and turns it into a point in world space
// this is the equivalent of Transform.TransformPoint on the scripting side
float4 worldSpaceVertex = mul( unity_ObjectToWorld, localSpaceVertex );
 
// Height of the vertex in the range (0,1)
float height = (localSpaceVertex.y/2 + .5);
 
worldSpaceVertex.x += sin( _Time.x * _WindFrecuency + worldSpaceVertex.x * _WindGustDistance) * height * _WindStrength * _WindDirection.x;
worldSpaceVertex.z += sin( _Time.x * _WindFrecuency + worldSpaceVertex.z * _WindGustDistance) * height * _WindStrength * _WindDirection.z;
 
// takes the new modified position of the vert in world space and then puts it back in local space
v.vertex = mul( unity_WorldToObject, worldSpaceVertex );
 
}
 
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
 
}
FallBack "Diffuse"
}
 


Изображение
blackrid
UNец
 
Сообщения: 6
Зарегистрирован: 19 окт 2019, 23:44

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение jr900 13 ноя 2019, 00:51

А чем обычная трава на террейне не подходит? Она же нормально колышется, там все настроить можно
Скачать бесплатно ассеты для Unity
Скачать ассеты для Unreal Engine 4 / 5
Скачать 3d-модели для игр и дизайна
Персонажи DAZ-Poser для игр
jr900
UNIт
 
Сообщения: 83
Зарегистрирован: 16 апр 2016, 10:13

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение blackrid 13 ноя 2019, 11:03

У меня уровень сделан mesh-моделью, с туннелями и прочими подземельями. К тому же я вроде читал, что террейн, а тем более нативная трава и деревья очень ресурсоёмкие. Или это не так?
blackrid
UNец
 
Сообщения: 6
Зарегистрирован: 19 окт 2019, 23:44

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение Jarico 13 ноя 2019, 11:49

blackrid писал(а):Или это не так?


Всё так, террейн предназначен для малого использования, не для огромных полей по 2048х2048... Некоторые умудряются делать террейны 4096х4096 и потом удивляться почему же игра вся в артефактах и фризах
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение jr900 14 ноя 2019, 01:27

Jarico писал(а):Всё так, террейн предназначен для малого использования, не для огромных полей по 2048х2048

Расскажите это разработчикам escape from tarkov :D
Terrain все равно гибче в использовании, особенно при озеленении уровня. Чем вы траву на меш сажаете? Трава тоже из мешей?
Скачать бесплатно ассеты для Unity
Скачать ассеты для Unreal Engine 4 / 5
Скачать 3d-модели для игр и дизайна
Персонажи DAZ-Poser для игр
jr900
UNIт
 
Сообщения: 83
Зарегистрирован: 16 апр 2016, 10:13

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение Dewa1s 14 ноя 2019, 05:01

Jarico писал(а):
blackrid писал(а):Или это не так?


Всё так, террейн предназначен для малого использования, не для огромных полей по 2048х2048... Некоторые умудряются делать террейны 4096х4096 и потом удивляться почему же игра вся в артефактах и фризах

Чоэта? У террейна отличная сетка с масштабируемой детализацией, с работающим оклюжн куллингом. Да и разрешение его важнее размера. Естественно надо отталкиваться от реалий игры, но и просто меш не панацея
Аватара пользователя
Dewa1s
Старожил
 
Сообщения: 564
Зарегистрирован: 26 дек 2011, 02:12

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение blackrid 05 дек 2019, 10:33

Я же написал - дело не столько в детализации, сколько в том, что на уровне есть пещеры и подземелья. Насколько я понимаю, чтобы проделать в террейне дырку, его надо все равно конвертировать в mesh.
blackrid
UNец
 
Сообщения: 6
Зарегистрирован: 19 окт 2019, 23:44

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение 1max1 05 дек 2019, 10:57

blackrid писал(а):Я же написал - дело не столько в детализации, сколько в том, что на уровне есть пещеры и подземелья. Насколько я понимаю, чтобы проделать в террейне дырку, его надо все равно конвертировать в mesh.

Ходят слухи что в альфе добавили возможность дырявить землю)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение Dewa1s 05 дек 2019, 11:24

1max1 писал(а):
blackrid писал(а):Я же написал - дело не столько в детализации, сколько в том, что на уровне есть пещеры и подземелья. Насколько я понимаю, чтобы проделать в террейне дырку, его надо все равно конвертировать в mesh.

Ходят слухи что в альфе добавили возможность дырявить землю)

Не слухи, спустя столько лет мы дождались-таки этой возможности
Аватара пользователя
Dewa1s
Старожил
 
Сообщения: 564
Зарегистрирован: 26 дек 2011, 02:12

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение 1max1 05 дек 2019, 11:43

Интересно как будет выглядеть экспорт raw data.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Туман не покрывает траву с шейдером движения от ветра

Сообщение Dewa1s 05 дек 2019, 12:24

1max1 писал(а):Интересно как будет выглядеть экспорт raw data.

я особо не копался, но там дыры делаются рисованием по слою, так что скорее всего равка будет такой же, разница будет в сплатмапе. Но это не точно
Аватара пользователя
Dewa1s
Старожил
 
Сообщения: 564
Зарегистрирован: 26 дек 2011, 02:12


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 21