Добавлен
Можно ли как-то сделать молнию в 2д?
и каким образом?
у нас есть текстура самой молнии, которая бесшовная (естественно только с одной стороны) как в варе.
как можно растягивать такую молнию, но чтобы менялся только размер спрайта, а текстура не растягивалась?
вопрос на засыпку: анимация 2д текстуры этой же молнии, как оно делается?

Tiodor, возможно. Но самый замечательный вариант это сгенерировать мэш с правильными текстурными координатами. И тогда ничего хитрого не надо придумывать. Поэтому надо курить генерацию мэша
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
24
RSQR, ну, значит, нужно писать - ничего сложного в этом нет.
Например, на соотношении высоты и ширины геометрии считаем вертексным шейдром кол-во тайлов и передаем пиксельному шейдеру, который, в свою очередь, уже выполняет сам тайлинг. Вот добавить анимацию будет чуть сложнее - нужно как-то получить текущее время и выбрать на его основе нужный кадр (читай смещение).
Как вариант - нет ли свободного тайлинга в свойствах материалов/текстур? Часто есть такая возможность, при том, что по умолчанию она не используется.
24
Tiodor:
я надеюсь, что разработчики будут активно двигаться в сторону 2д. ну надеюсь на это и расширят функционал.
Ну... функционал-то есть, только этого функционала надо самому добиваться)
Нашёл шейдер, на работоспособность пока не тестил
Shader "Tiles" {

    Properties {

        _MainTex ("Base (RGB)", 2D) = "white" {}

        _gNumTiles ("Number Of Tiles", Range (1,100)) = 1

        _gThreshhold ("Edge Width", Range (0.0,2.0)) = 0.15

        _gEdgeColor ("Color", Color)  = (.5, .5, .5, 1)

    }

    SubShader {

        Tags { "RenderType"="Opaque" }

        LOD 200

        

        CGPROGRAM

        #pragma surface surf Lambert

 

        sampler2D _MainTex;

 

        struct Input {

            float2 uv_MainTex;

        };

        

        float _gNumTiles;

        float _gThreshhold;

        float4 _gEdgeColor;

        

    void surf (Input IN, inout SurfaceOutput o) {

            

        half size = 1.0/_gNumTiles;

        half2 Pbase = IN.uv_MainTex - fmod(IN.uv_MainTex,size.xx);

        half2 PCenter = Pbase + (size/2.0).xx;

        half2 st = (IN.uv_MainTex - Pbase)/size;

        half4 c1 = (half4)0;

        half4 c2 = (half4)0;

        half4 invOff = half4((1-_gEdgeColor.xyz),1);

        if (st.x > st.y) { c1 = invOff; }

        half threshholdB =  1.0 - _gThreshhold;

        if (st.x > threshholdB) { c2 = c1; }

        if (st.y > threshholdB) { c2 = c1; }

        half4 cBottom = c2;

        c1 = (half4)0;

        c2 = (half4)0;

        if (st.x > st.y) { c1 = invOff; }

        if (st.x < _gThreshhold) { c2 = c1; }

        if (st.y < _gThreshhold) { c2 = c1; }

        half4 cTop = c2;

        half4 tileColor = tex2D(_MainTex,PCenter);

        half4 result = tileColor + cTop - cBottom;

        o.Albedo = result.rgb;

        o.Alpha = result.a;

            

        }

        ENDCG

    } 

    FallBack "Diffuse"

}
24
RSQR, не годится же - он получает кол-во тайлов в параметрах, а не считает на основе размеров геометрии. А передача параметров в шейдер, вероятно, потребует создания отдельного материала, как и для стандартного. Не то чтобы это было такой проблемой - создание отдельного экземпляра материала динамически это нормально, просто можно ведь в данном конкретном случае обойтись без этого - геометрия молнии проста как пробка (пока не гарантирую работоспособность предложенного мной алгоритма т.к. нет времени попробовать его реализовать на практике, но такой шейдер и мне самому не помешает).
24
ZregerZ, если вы не заметили, здесь обсуждается во-первых юнити, а не XNA, а во-вторых куда более простой эффект, основанный на тайлинге спрайта, а не создании множества сегментов на каждую молнию.
14
prog,
здесь обсуждается во-первых юнити, а не XNA
Note: Although this tutorial is written using C# and XNA, you should be able to use the same techniques and concepts in almost any game development environment.

во-вторых куда более простой эффект, основанный на тайлинге спрайта а не создании множества сегментов на каждую молнию.
Можно ли как-то сделать молнию в 2д?
и каким образом?
24
ZregerZ, а прочитать дальше не судьба?
у нас есть текстура самой молнии, которая бесшовная (естественно только с одной стороны) как в варе.
как можно растягивать такую молнию, но чтобы менялся только размер спрайта, а текстура не растягивалась?
вопрос на засыпку: анимация 2д текстуры этой же молнии, как оно делается?
Не говоря уже о комментариях, где автор вопроса конкретно пояснил что его интересует:
Tiodor:
вот. у нас есть текстура молнии как сверху слева.
и в зависимости от расстояния она тайлится + анимация текстуры от начала к концу. то есть текстура движется.
14
prog, Молнии в варкрафте - ужасные.
Стоя в комнате с кучей дверей и попытавшись открыть одну из них, что разумнее: продолжить биться головой в эту дверь в надежде, что она выломается или попробовать открыть другие двери?
Вопрос состоит из 3 (не считая того что на засыпку) Можно ли? Если да то как? Мы придумали, что можно так, но сделать не можем, как нам сделать так как мы придумали?
Я ответил на 1 и 2 вопросы т.к. с юнити не знаком поэтому не ответил на 3й.
return 0;
30
Молнии в варкрафте - ужасные.
а при чем тут молнии в варе? о_О
а за ссылку спс

есть костыльная идея сделать 2-3 варианта молнии: короткая, средняя, длинная и в зависимости от расстояния рисовать разные молнии, растягивая спрайт в определенных пределах
29
Tiodor, возможно. Но самый замечательный вариант это сгенерировать мэш с правильными текстурными координатами. И тогда ничего хитрого не надо придумывать. Поэтому надо курить генерацию мэша
Принятый ответ
21
А что, если я вам скажу, что если вы будете изменять параметры материала отдельно для каждого обьекта в Апдейте, то эти самые параметры в итоге отобразятся у всех разные? С цветом у меня так работало. Думаю, с тайлингом тоже сработает.
Таким образом мы считаем расстояние между двумя точками, посл чего это число вставляем в показатель тайлинга по икс. Для каждой молнии отдельно, да.
Тадам.
Немного затратно, но терпимо.
анимацию можно сделать через статическую функцию, которая будет менять тайл молнии с одного кадра на другой, учитывая, что все анимы на одной текстуре.
alexprey:
Tiodor, возможно. Но самый замечательный вариант это сгенерировать мэш с правильными текстурными координатами. И тогда ничего хитрого не надо придумывать. Поэтому надо курить генерацию мэша
еще более затратно, чем мой вариант
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.