Comments 37
фигасе, оно ещё живое?
наверное больше 10-15 лет не заглядывал с тех пор, когда ещё только браузеркой было на флеше
Примерно такие же эмоции.
Хотя и бросил играть очень давно, когда они переделали систему прокачки кинув всех уже прокачавшихся (было 5 прокачанных танков, а после изменений компенсации не хватило даже на 1).
Бросил, потом их базу угоняли, на моём акке кто то катал, его забанили, а спустя ещё несколько лет у альтернативщиков что то случилось и они до сих пор засоряют мой емейл просьбами вернуться.
недавно вернулся, ну как вернулся, попытался - аккаунт то в блоке и саппорт говорит "идите лесом ничего мы делать не собираемся" ни на просьбу разбанить раз уж зовёте или хотя бы перестать спам слать.
Пришлось аж отдельное правило для домена создать с отправкой в спам, потому что его много, он разнообразный в шаблонах и с разнообразных под-адресов.
p.s.
Сейчас ради интереса залез в почту, вспомнил что в процессе всего этого у меня ещё и ник сперли с которым аккаунт был зареган. А замечательные альтернативщики конечно выше того что бы предупреждать об этом людей)
Игра может быть и норм с технической точки зрения, но вот процессы в компании создателе такие что лучше не связываться, имхо.
не помню что за танки у меня на акке были, только один такой скрин вроде на диске остался (2012 год опера на престо ещё, возможно один из последних заходов в акк)

Пришлите, пожалуйста, адрес электронной почты на help@tankionline.com, разберёмся.
спасибо, очень красивая картинка, лес красивый, хочу про кд дерево и некоторый расчет прокомментировать, симд операции чуть могут ускорить если операции на ЦПУ, некоторые математические операции просто быстрее надеюсь вы пользуетесь кватернионами. (Симд)Но да там придётся сравнивать и замерять скорость, (иногда возможно лучше не делить а умножать, ну это конечно такое в целом, но иногда возможно)
Спасибо за комментарий. Да, SIMD это классно, но с ним тоже надо уметь работать, переключение с векторных регистров на скалярные и в обратную сторону не очень быстрое.
переключение с векторных регистров на скалярные и в обратную сторону не очень быстрое.
Какое конкретно переключение? На дворе не 1997г.
Скалярные операции работают с теми же самыми регистрами, что и SIMD. И на х86 и на ARM.
Но можно ли там грабить корованы?
Я в некоторых проектах делал буффер небольшого разрешения (512х512) проецировал его вокруг камеры игрока на все поверхности (в шейдере сделал виртуальную высоту аля +-2м) и в этот буффер рендерил и светильники и тени.
Подход не очень дешевый, но есть куча методов оптимизации, а главное - тысячи светильников и теней почти бесплатно ( с инстансингом), любых форм/размеров, с анимациями.
А вы тоже зашли сюда в первую очередь потому что в названии было словосочетание "Танки Онлайн"?
Был рад узнать, что проект все ещё живой и даже выходит на другие платформы.
То есть по сути технология заключается в том, что быстро выбираем кусок геометрии под танком, строим из него меш с проекционным UV и рисуем полупрозрачный серый силуэт танка?
Весьма сильная заморочка ради тенек.
Да, это техника проекционных мешей, мы ее применяем и для декалей и линейного света.
UV формируются в шейдере
Varyings vert (Attributes input)
{
Varyings output;
UNITY_SETUP_INSTANCE_ID(input)
UNITY_TRANSFER_INSTANCE_ID(input, output);
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.vertex.xyz);
output.positionCS = vertexInput.positionCS;
output.uv = input.vertex / _Size + 0.5; // нормализванное положение вершины: [0; 1]
output.fogFactor = CalculateFogFactor(vertexInput.positionCS);
return output;
}
Вертикальная компонента также используется для затухания по высоте, причем, затухание выше тени сильнее, чем ниже:
float y = input.uv.y; // [0; 1]
float fade = 1-y; // затехание тени сверху вниз [0; 1]
fade *= fade; // нелинейное затухание
float4 color = tex2D(_BaseMap, input.uv.xz) * _Color;
А сам силуэт каждый кадр рендерит танк в отдельную текстуру?
Или не каждый кадр а время от времени?
Он ведь разный будет в зависимости от поворота
А если, взять полупрозрачный плейн, приаттачить к танку. Затем выставить игнор глубины всего кроме танка. Рисовать тень как серию из текстуры анимации типа партикла. А потом при повороте угла самого танка подменять на соответствующий кадр для тени (типа такого теневого импостора)?
А как это будет выглядеть на подъемах, рядом с вертикальными пропами, клиффах и т.д.?
Все будет затеняться, что собственно и требуется от тени.
Плейн же плоский
Плоский. Он разве не может затемнять террайн, просто игноря его глубину?
Можно, но сам террейн же не плоский, на нем есть подъемы и другие неровные дороги и поверхности. Будет видно что проходит насквозь, втыкаясь в террейн.
ИМХО, безумное количество работы ради незначительного эффекта, которого можно было бы достичь меньшими затратами. Особенно примечательно, что других теней в сцене вообще нет и все силы стоило бы бросить на решение этой проблемы.
В индустрии давно используются обычные Box меши, которые размещаются под днищем объекта, в данном случае танка. В шейдере семплим depth текстуру и через object-space определяем, находится ли пиксель внутри этого бокса. Если да, то смешиваем с фоном. Ну и разумеется мы это все делаем после Tansparent прохода.
Вы пишете, что семплинг depth текстуры слишком дорог, но это выглядит довольно странно. Может быть вы написали неэффективный шейдер, который семплит каждый пиксель? В этой реализации мы "смотрим" малую часть этого буффера, только ту, которую занимает box. В норме такой подход вообще должен быть бесплатен для одного бокса (по моим данным 0.009мс при времени кадра 33мс, платформа PC).
В простейшей реализации даже текстуры не нужны, все задается параметрами материала.
С этого стоит начать ресерч: https://godotshaders.com/shader/decal-example/
Вы описываете подход декалей на основе текстуры глубины. Для текстуры глубины вам надо или сцену рисовать 2 раза, или делать резолв глубины. С включенным мсаа это может быть долго. Если честно, не замерял, но не думаю что это быстро для свитча.
В любом случае, это дольше чем построить меш и просто рисовать.
Зачем сцену рисовать дважды? Depth текстура рендерится в процессе отрисовки непрозрачной геометрии, вам нужно в вашем кастом проходе использовать её (погуглите _CameraDepthTexture).
Резолвить тоже не нужно, это ведь тень. Если у нее будет не до конца точная геометрия, игрок это не заметит. Семплинг глубины тут нужен не для того, чтобы определить, какие объекты перекрывают тень, а для того, чтобы понять как её проецировать поверх них.
Этот подход в мобильных играх на девайсах из 2010-х работает стабильно, уверен что для свитча это не проблема.
В любом случае, ваша работа уже выполнена и будет странно всё переделывать)
Как, по-вашему, формируется _CameraDepthTexture? Вы или отдельным пассом ее заполняете (а это два раза рисовать сцену), или копируете из буфера глубины, с МСАА это может быть дорого, так как нужен резолв.
Unity как правило выполняет DepthPrepass в начале кадра и эта текстура и называется _CameraDepthTexture. Вам не нужно копировать, вам нужно семплить прямо из неё. Она к моменту использования уже готова.
Не поленюсь продемонстрировать

Так чтобы ее сформировать, надо или рисовать в нее, или копировать из буфера глубины. Потом уже использовать.
Что вы имеете ввиду под "сформировать"? Вся сцена уже отрендерена в нее, вы можете семплить из буффера глубины "как есть". Используйте
float sceneZ = LOAD_TEXTURE2D(_CameraDepthTexture, somePosition.xy).x;
И вы получите данные из нее без необходимости куда-то копировать
Вы не можете напрямую читать из буфера глубины, вы можете читать из текстуры глубины, а в нее скопировать буфер глубины.
Разбор рендера фейковых теней (и не только) в Танки Онлайн