@Deathgar

Шейдеры, реагирующие на объекты. Как такое создаётся?

Разобраться в шейдерах очень сложно, всё, что есть в интернете это только основы. Не могли бы вы подсказать где найти какую нибудь информацию или видео (желательно на русском, желательно), которая покажет мне как это происходит.
Я говорю о шейдерах, которые взаимодействуют с разными объектами, будь то берег, вот такая штука(https://www.assetstore.unity3d.com/en/#!/content/24707) или вот такая (https://www.assetstore.unity3d.com/en/#!/content/24707) , или пример не покажу, но щиты энергетические щиты, при попадании в его какое-то место, происходит волна, расходящаяся по шейдеру. Надеюсь объяснил что мне нужно понятно.
  • Вопрос задан
  • 786 просмотров
Решения вопроса 2
GavriKos
@GavriKos Куратор тега Разработка игр
Ну во первых - раз у вас ссылки на ассетстор - купите/скачайте те шейдера и разберите их.

Во вторых. Тут могу ошибаться, но все таки. Шейдер сам по себе никак не взаимодействует с объектами. Есть просто возможность передавать в рантайме из кода какие то данные в шейдер. Вот в момент например попадания - в шейдер и передаются координаты коллизии, а он уже рисует волны.
Ответ написан
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Как ни странно, про шейдеры очень хорошо написано в мануале. Там есть отличные примеры вершинно-пиксельных и поверхностных шейдеров. Помимо мануала еще есть серия туториалов на Wikibooks, где подробно всё разбирается с основ. Начинать лучше с вершинно-пиксельных шейдеров, в конечном итоге всё сводится к ним, поверхностные шейдеры это просто синтаксический сахар, да и те же постэффекты делаются только на пиксельных шейдерах. Кроме того, я бы настоятельно рекомендовал поставить Visual Studio вместе с Visual Studio Tools for Unity, иначе не получите худо-бедной подсветки синтаксиса, шейдеры и так сложно дебажить, так хоть будет полегче. В качестве образца ещё часто пригождаются встроенные шейдеры, скачать их можно на этой странице.

Что касается взаимодействия шейдеров с объектами, так оно отсутствует. Шейдеры ничего не знают про сцену и объекты, они работают только с данными, которые есть в модельке, экранных буферах и переданных параметрах. Есть ещё глобальные константы и ключевые слова, но не думаю, что они вам в скором времени понадобятся.

Если говорить конкретно о примере с просвечиванием сквозь стену, то делается оно довольно просто с помощью двухпроходного шейдера с изменённым ZTest. Один раз моделька рисуется только там, где в z-буфере уже что-то есть, и один раз рисуется "как обычно". В шейдере ниже я просто скопировал второй раз проход из обычного Unlit шейдера и добавил строчку с ZTest Greater, ничего сложного.
Пример шейдера
Shader "Custom/Example"
{
    Properties
    {
        _Color ("Color", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            float4 _Color;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                return _Color;
            }
            ENDCG
        }

        Pass
        {
            ZTest Greater

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            float4 _Color;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return -_Color;
            }
            ENDCG
        }
    }
}


Энергетические щиты можно сделать разными способами, обычно это комбинация шейдеров, скриптов, систем частиц и анимаций. Например в шейдере может быть массив точек, рядом с которыми в определённом радиусе рисуется кружок. Точки передаются в материал с помощью Material.SetVectorArray или в рендерер с помощью MaterialPropertyBlock.SetVectorArray и Renderer.SetPropertyBlock. Далее в скрипте с помощью функции или анимации меняется радиус рисуемого кружка и одновременно запускается система частиц. Всё это вместе выглядит как энергетический щит, но нельзя сказать, что дело только в шейдере.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы