Перейти к контенту

Anonim

Жители
  • Число публикаций

    766
  • Регистрация

  • Последнее посещение

  • Дней в топе

    15
  • AMKoin

    187 [Подарить AMKoin]

Anonim последний раз побеждал 30 Сентября 2019

Anonim - автор самых популярных публикаций!

Баланс оценок

680

11 подписчиков

О Anonim

  • День рождения 4 Апреля

Звание

  • Звание
    TEXCOORD0

Информация

  • Реальное имя
    Данил
  • Город
    Пласт

Недавние посетители профиля

4 950 просмотров профиля
  1. Physically based rendering, хотя в нашем случае вернее всего сказать shading но оставим так, ибо звучнее. На неделе сделаю полноценную статью с разбором о реализации на наш сталкер, пока просто тема чтобы посмотреть насколько эта тема интересна, короче обсуждаем.
  2. Anonim

    Шейдеры

    @shuherist, смотря какие шейдеры у тебя указаны в скриптовом шейдере, проходишь в пиксельный шейдер и удаляешь там макрос NEED_SOFT_WATER. Шедейвр для воды один основной water.ps\vs, который другие(water_soft,water_studen etc...) юзают в кач-ве родительского лишь оперируя макросами.
  3. Accurate Atmospheric Scattering and The Real-time Volumetric Cloudscapes https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter16.html https://www.guerrilla-games.com/read/the-real-time-volumetric-cloudscapes-of-horizon-zero-dawn А почему бы нет? Отложим текстуры скайбокосов и будем генерировать небо с облаками в рилтайме. Я уже попробовал реализацию по выше предложенным статьям, моя реализация на стуклир пока что сыра и рано её публиковать в народы. Конкретно что вышло у меня в видео здесь -> https://yadi.sk/i/z43YN5FVXJUWuw Что думаете по этому поводу, нужно ли оно вообще? Сразу скажу что мой компуктер положило до 10 фпс. Ну и конечно давайте делитесь своими успехами по этой теме. Может быть есть более лёгкие альтернативы.
  4. Anonim

    SSLR

    @DDamian724, Привет, вода в сталкере является forward'ом, как и стёкла, поэтому применить блюр к отражениям у тебя не получится без всяческих ухищрений. А адаптировать сам SSLR шейдер проще простого. Достаточно удалить функции получения позиции и нормали и заменить их на те, что есть в шейдере воды. eye_vec у тебя уже посчитан в вершинном шейдере воды o.v2point = P-eye_position ; И нормализован в пиксельном шейдере half3 v2point = normalize (I.v2point); v2point = eye_vec Получается вектор взгляда у тебя есть, мировая нормаль воды тоже есть в оригинальном шейдере, она так же нормализована half3 Nw = mul (half3x3(I.M1, I.M2, I.M3), Navg); Nw = normalize (Nw); И вектор отражения half3 vreflect = reflect (v2point, Nw) ; Создавай хэдер SSLR и во входных параметрах укажи vreflect вместо refl_vec. Код примерно такой будет: И в шейдере воды: #include "SSLR_header.h" ........ half4 main(){ ........ half3 env = SSLR(vreflect); ........
  5. Anonim

    Шейдеры

    https://www.amk-team.ru/forum/topic/14078-sslr/
  6. Как и обещал, разбор полётов по SSLR и создание луж под ногами от всех этих махинаций. Такс, для начала создадим новый рендер таргет формата D3DFMT_A8R8G8B8 с размерами экранного квада, этого нам будет достаточно. Ага, сделали мы уже много, а отражений всё ещё нет. Будем разбираться почему же так. В данный РТ'шник мы будем писать/записывать/зачитывать/засовывать результат работы нашего SSLR шейдера. Начнём, напишем основу шейдера: #include "common.h" // подключим стандартную библиотеку с ощими функциями struct v_SQ // обычная simple quad структура с позицией и текстурными координатами // с учётом того что мы рендерим без вертексного шейдера { float4 hpos:POSITION; float2 tc0:TEXCOORD0; }; float4 main(v_SQ inst):COLOR { return float4(1,0,0,1);// пока что возвратим красный цвет } Для расчёта вектора отражения нам нужно найти вектор взгляда на позицию пикселя и найти отражение этого вектора от нормали. И так, сначала будем искать позицию пикселя в ворлд спейсе float3 pos = tex2D(s_position,inst.tc0); return float4(pos,1); //return float4(1,0,0,1); Так не канает, ведь нам нужна позиция пикселя в ворлд спейсе, а не скрин спейсе. Для этого я состряпал такую функцию float3 getWSpos(float2 tc)//текстурные координаты { float3 VSpos = tex2D(s_position,tc); // скрин спейс позиция пикселя float3 WSpos = mul(m_inverse_view,float4(VSpos,1)); // умножаем на иверсную матрицу вида проекции и получаем позицию в мировом пространстве return WSpos;// отдаём } Теперь попробуем её //float3 pos = tex2D(s_position,inst.tc0); float3 pos = getWSpos(inst.tc0); return float4(pos,1); //return float4(1,0,0,1); Посмотрим Вот так интереснее. Теперь найдём вектор взгляда на этот пиксель float3 eye_vec = normalize(pos-eye_position);//сразу же нормализуем этот вектор Теперь для расчёта вектора отражения нам нужно найти мировую нормаль, не буду таить и сразу выкачу функцию которая так же преобразует сс нормаль в вс float3 getWSnorm(float2 tc) { float posZ = tex2D(s_position,tc).z;//определим глубину float3 VSnorm = tex2D(s_normal,tc);//сс нормаль float3 WSnorm = mul(m_inverse_view,float4(VSnorm,0));//находим таким же способом вс нормалю WSnorm.y *= clamp(posZ,sslr_params.x,sslr_params.y);//кое-где сгладим нормаль в зависимости от расстояния WSnorm=normalize(WSnorm);//нормализуем return WSnorm;//отдадим } sslr_params.xy - факторы расстояния Всё, находим вектор отражения float3 norm = getWSnorm(inst.tc0); float3 refl_vec = normalize(reflect(eye_vec,norm)); Заранее объявим несколько переменных float2 refl_tc = float2(0,0);//текстурные координаты отражённой геометрии float L = sslr_params.z;// начальная длина луча Всё пускаем в бой тяжёлую артиллерию, а именно, цикл for(int i = 0; i < 6; i++)// как показали тесты 6 проходов вполне достаточно для получения приемлимого результата { float3 new_pos = pos.xyz + refl_vec*L; // получаем новую позицию float4 new_pos_proj = mul(m_VP,float4(new_pos,1));//переводим её в скрин спейс new_pos_proj.xyz /= new_pos_proj.w; //нормализуем float2 sample_tc = float2(0,0);// создаём новую переменную в теле цикла, куда будем толкать новые текстурные координаты //мы получаем позицию пикселя в диапазоне от -1 до 1, это дело нам как то нужно перевести в диапазон от 0 до 1 //вот так sample_tc.x = (new_pos_proj.x+1)*0.5; sample_tc.y = 1-((new_pos_proj.y+1)*0.5); float3 hit_pos = getWSpos(sample_tc);//каждый проход цикла мы будем получать позицию, но уже с новыми текстурными координатами L=length(Hpos-pos); refl_tc=sample_tc;//отправим полученные текстурные координаты на выход } Почти всё, осталось только вывести отражённую геометрию float3 refl_img=tex2D(s_image,refl_tc); return float4(refl_img,1); Я объяснил базовую реализацию SSLR, улучшать технику можно сколько угодно и это в ваших руках. О реализации луж, чуть позже, как только соберётся время. Пока можете посмотреть сурсы с базовой реализацией SSLR и лужами вот тут SSLR https://github.com/Baryshev194/x-ray1.0007/commit/b07e191b9f545dc47d71d457a12817b7ced87a82 SSLR blur https://github.com/Baryshev194/x-ray1.0007/commit/8408d0c04e6980cf476e526739c8551b11d4c3f0 Wetness buffer + Puddles effect https://github.com/Baryshev194/x-ray1.0007/commit/0b9d9975711a86c0cc14c9236c2bd318eb5da65b
  7. Anonim

    Шейдеры

    Муви-пикча -> https://yadi.sk/i/z43YN5FVXJUWuw
  8. Anonim

    Шейдеры

    Всем привет, статейка по SSLR и реализации луж в S.T.A.L.K.E.R. пока откладывается, так как я начал делать кое-что новое, а именно физически корректное атмосферное рассеивание. Что же это? Смотрите ссылку->Accurate Atmospheric Scattering Зачем оно? Использование skybox текстуры отпадает, ведь цвет неба расcчитывается шейдером исходя из положения солнца в world space. Как оно получилось в S.T.A.L.K.E.R.: Возвращаемые значения шейдера будут явно больше еденицы, поэтому стоит применить им тональную компрессию. Оставлять это так нельзя, ведь в реале на небе ещё и облака есть. Наверное многие знают о игре Horizon Zero Dawn и о её технологии создания volumetric clouds. Конечно, и раньше умели рендерить объёмные облака в реалтайме, но эта игра привнесла некий стандарт по которому сейчас реализуют эту фичу. Собственно, исследуя интернет и папирусы Horizon Zero Dawn начал реализацию. Вот так оно, конечно же Work in Progress: Толкового освещения ещё нет, но всё же, я убедился что вполне реально это реализовать. Конечно же, на скриншотах нет skybox текстуры, всё сделано в реалтайме, убедиться в этом можно сравнивая скриншоты по порядку.
  9. Anonim

    Шейдеры

    Недавно задался темой реализации wet dynamic asphalt roads puddles with screen space local reflections and light road on surface, хех Соб-сна что у меня вышло https://yadi.sk/i/PamHVm-pXqdkOg <-ВИДЕО Кому интересна данная тема, можете заглянуть в клуб https://www.amk-team.ru/forum/clubs/6-klub-texcoordn/, в скором времени я опишу там реализацию данного эффекта. Немного экспериментов с самими отражениями
  10. Anonim

    Шейдеры

    Мб кому тоже полезно будет. Для своей модификации решил одолжить деревья из другой игры, но столкнулся с одной проблемой. Текстуры веток были отличными от сталкерского формата (много маленьких деталей на текстуре) и alpha test тупо сожрал все пиксели и на большом расстоянии остались только, грубо говоря, стволы. Решение тут: https://developer.download.nvidia.com/assets/gameworks/downloads/regular/GDC17/RealTimeRenderingAdvances_HashedAlphaTesting_GDC2017_FINAL.pdf?haLeJXf_sAUMW3MsvSW3JqZolzqe8V0cLD39HpIHfTn8mjUCNzrxAOFEoM087FUnUlcegNg2OUzOCW4k7lS1HaVoj0NdC1OmPuQiQ6f6HSEnuARAu8eWQXJQ0nTbkVjI8UE6tSouBvZYL0ynu-2OjyOOqxURlqnE6TOoR3A1k_Toc-_65U4n9DYavKT5tIiGJCB-klrhLVGtSGpSsxcAgZzmhheWzg Что вышло: Добавить ещё анти алиасинга и может даже тошнить не будет. Для большей наглядности можно быстро пощёлкать скрины между собой.
  11. Anonim

    Шейдеры

    Нет, для этого я и говорил где шейдер править) Если кому-то нужна стоящая вода, могу поглядеть как это можно нормально сделать.
  12. Anonim

    Шейдеры

    @warwer дак нужно ещё нормал мап править) Он же в оригинале seq файл.
  13. Anonim

    Шейдеры

    Ты сам же на свой вопрос и ответил, но я начинаю думать, что ты хочешь запилить стоячую воду для помещений. Тогда просто сделай как я говорил выше и поправь нормал мап для нужной водички.
  14. Anonim

    Шейдеры

    Привет, править вершинный шейдер. o.tnorm0 = watermove_tc (o.tbase*W_DISTORT_BASE_TILE_0, P.xz, W_DISTORT_AMP_0); o.tnorm1 = watermove_tc (o.tbase*W_DISTORT_BASE_TILE_0, P.xz, W_DISTORT_AMP_0); Допустим можно так, а можно и во фрагментном, но там дольше.

AMK-Team.ru

×
×
  • Создать...