• Шейдер для создания эффекта ветра на листьях, кустах и т.д.

    Первая версия моего шейдера, всё вроде бы хорошо, но в зоне тумана не работает.
    Подсмотрел на https://ru.stackoverflow.com/questions/945023/Деформация-анимация-картинки-на-unity

    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
                            }
                    }
    }
     
    

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

    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"
    }
    
    

    На всякий случай, выкладываю файлы шейдеров в виде архива:
    https://blackrid.ru/upload/files/29_08_2021/wind.zip



  • Движок Unity. Обучаемся всему заново.

    Если вкратце, то в прошлом году я начал осваивать Unity 3D. Поскольку, в программировании я не новичок, то довольно быстро разобрался, что к чему.

    За основу я взял игру "S.T.A.L.K.E.R. Тени Чернобыля". Почему её? Потому что все доступные ресурсы из неё уже давно выдраны и существует гигантское комьюнити мододелов. Для своего обучения решил попробовать собрать уровень, используя контент из этой игры.

    В общем, дело пошло, я собрал тестовую локацию, было готово следующее:

    1. Инвентарь. Там были только патроны для автомата, но сама система инвентаря работала
    2. Земля была раскрашена тремя текстурами, которые перемешивались по маске, был плавный переход земля-бетон-песок
    3. Система стрельбы, перезарядка, просчет попаданий пули, определение материала, в который попала пуля, вылетающие от попадания куски штукатурки/или дерева
    4. Фонарик
    5. Сидящий у себя в бункере Сидорович. Он здоровался и прощался, когда мы выходили
    6. Открытие-закрытие дверей. Тестировал на двери бункера Сидоровича
    7. Смена дня и ночи, динамический туман, не дефолтный, а самописный, менее ресурсоемкий
    8. Ветер. Опять же не дефолтный, а свой. Трава и листья деревьев плавно колыхались
    9. Предметы, раскиданные по уровню (коробки с патронами, аптечки и т.п.)
    10. Миникарта с позицией игрока
    11. Динамический прицел, который менял форму и цвет, показывал имя NPC при наведении или название предмета
    12. Удобное мобильное управление, кнопки и тач-панель
    13. Определение типа поверхности, по которой мы ходим (для воспроизведения разного звука шагов по металлу, бетону, земле)
    14. Динамическое расставление кустов и травы, настройка плотности растительности

    Еще какие-то фишки были в разработке, но... внезапно умер винт. К сожалению, как это очень часто бывает, никаких бэкапов не осталось, только в моей голове )

    Вот несколько видео, которые я успел сделать перед этим:

    Unity3D. Пробуем сделать FPS на основе ресурсов STALKER

    Unity3D: анимация mesh-травы. Движение от ветра

    Unity3D: триггер на вход-выход

    Unity3D: настроил анимацию и звук двери бункера

    Unity3D: игры с туманом и освещением сцены


    После полугодового перерыва придется вспоминать все заново. Оно, наверное, к лучшему - сейчас я могу более четко просчитать структуру и иерархию кода, более вдумчиво подойти к моментам, которые тогда реализовал не полностью.

    В общем, буду публиковать свои успехи. Ждите обновлений )



  • Как сделать экспорт чата в Telegram?

    1. Экспорт истории с помощью Telegram Desktop. В ПК-версии мессенджера есть функция, позволяющая полностью скачать всю переписку, включая медиафайлы, стикеры и ссылки.
    Для этого в меню «трех точек» нажмите «Экспорт истории» и выберите данные, которые хотите выгрузить. Чат будет сохранен в html-формате (его можно открыть через любой браузер).

    2. Скачивание истории с помощью web-версии Телеграм. Зайдите на web.telegram.org, откройте нужный чат, в меню браузера выберите «печать в PDF» и экспортируйте переписку в файл.

    3. Скриншоты или запись экрана. Это самый простой способ сохранения коротких диалогов.

    4. Репост в «Избранное». Отдельные важные сообщения перекидывайте себе в «Избранное» (Сохраненные сообщения) — так они всегда будут у вас на виду, даже если собеседник их сотрет.





  • Converting timestamp...

    How to get the current epoch time in ...

    PHP time() More PHP
    Python import time; time.time() Source
    Ruby Time.now (or Time.new). To display the epoch: Time.now.to_i
    Perl time More Perl
    Java long epoch = System.currentTimeMillis()/1000; Returns epoch in seconds.
    C# DateTimeOffset.Now.ToUnixTimeSeconds() (.NET Framework 4.6+/.NET Core), older versions: var epoch = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
    Objective-C [[NSDate date] timeIntervalSince1970]; (returns double) or NSString *currentTimestamp = [NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]];
    C++11 double now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count();
    Lua epoch = os.time([date])
    VBScript/ASP See the examples
    AutoIT _DateDiff(′s′, "1970/01/01 00:00:00", _NowCalc())
    Delphi Epoch := DateTimetoUnix(Now); Tested in Delphi 2010.
    R as.numeric(Sys.time())
    Erlang/OTP erlang:system_time(seconds). (version 18+), older versions: calendar:datetime_to_gregorian_seconds(calendar:universal_time())-719528*24*3600.
    MySQL SELECT unix_timestamp(now()) More MySQL examples
    PostgreSQL SELECT extract(epoch FROM now());
    SQLite SELECT strftime(′%s′, ′now′);
    Oracle PL/SQL SELECT (CAST(SYS_EXTRACT_UTC(SYSTIMESTAMP) AS DATE) - TO_DATE(′01/01/1970′,′DD/MM/YYYY′)) * 24 * 60 * 60 FROM DUAL;
    SQL Server SELECT DATEDIFF(s, ′1970-01-01 00:00:00′, GETUTCDATE())
    IBM Informix SELECT dbinfo(′utc_current′) FROM sysmaster:sysdual;
    JavaScript Math.floor(new Date().getTime()/1000.0) The getTime method returns the time in milliseconds.
    Visual FoxPro DATETIME() - {^1970/01/01 00:00:00} Warning: time zones not handled correctly
    Go time.Now().Unix() More Go 
    Adobe ColdFusion
    Tcl/Tk clock seconds
    Unix/Linux Shell date +%s
    Solaris /usr/bin/nawk ′BEGIN {print srand()}′ Solaris doesn′t support date +%s, but the default seed value for nawk′s random-number generator is the number of seconds since the epoch.
    PowerShell [int][double]::Parse((Get-Date (get-date).touniversaltime() -UFormat %s))
    Other OS′s Command line: perl -e "print time" (If Perl is installed on your system)

    Под катом еще...





  • Хабр: Как я создал собственный алгоритм YouTube (чтобы не тратить время впустую)

    Взято отсюда



    Побег от алгоритма YouTube


    Я люблю смотреть видео на YouTube, осязаемым образом улучшающие мою жизнь. К сожалению, алгоритм YouTube с этим не согласен. Он любит кормить меня кликбэйтом и прочим мусором.

    Всё это неудивительно: алгоритм отдаёт приоритет кликам и времени просмотра.

    Поэтому я поставил перед собой задачу: Смогу ли я написать код, который автоматически будет находить ценные видео, избавив меня от привязанности к алгоритму YouTube?

    Вот так всё и началось.

    Оптимально выстроенные планы


    Я начал с визуализации того, что должен делать мой инструмент. Мне нужна была программа, которая будет (i) ранжировать видео на основании вероятной релевантности для меня и (ii) автоматически отправлять мне предлагаемые видео, из которых я смогу выбирать.

    Я решил, что смогу серьёзно повысить продуктивность, если буду пакетно выбирать наборы видео для просмотра на каждую неделю и избавлюсь от необходимости бесконечного скроллинга YouTube.

    Остальное - под катом.



  • Автокурицы и водятлы

    Казалось бы - чего завелся-то? Объявление как объявление...

    Во-первых, коробит само слово "атоледи". При моем крайне негативном отношении к женщинам за рулем автомобиля, я могу их сравнить только с пугливой курицей. Но, если уже пошла такая пьянка, то мужчина за рулем - это "автоджентельмен"? "Автоденди"? "Автогосподин"?

    Но дело даже не в этом. Если бы новость была про презентацию новой модели бабского автомобильчика, то еще куда ни шло. Но тут новость про ДТП, совершённое тупой курицей, которую называют "автоледи". Хочу предложить правильный вариант заголовка:



Загрузка...

Войти на сайт

Регистрация