Jump to content

About This Club

Реализуем. Кипятим мозги.

Устав клуба

struct чаво_не_желательно_оставлять_здеся {

"Зделаити" за меня                 :  вообще_нежелательно0;
"Акак" сделать всё мега прекрасно  :  вообще_нежелательно1;
любой "кык акак"                   :  вообще_нежелательно2;

};

half4   main   (  чаво_не_желательно_оставлять_здеся   I  ):НАДЕЕМСЯ_НА_РЕЗУЛЬТАТ
{
 Окей, поехали. Здесь рассуждаем о графике в стулкире, реализуем те или иные эффекты, просим помощи, переносим из других игр;
}

  1. What's new in this club
  2. Physically based rendering, хотя в нашем случае вернее всего сказать shading но оставим так, ибо звучнее. На неделе сделаю полноценную статью с разбором о реализации на наш сталкер, пока просто тема чтобы посмотреть насколько эта тема интересна, короче обсуждаем.
  3. Ну на r2 получилось сделать нормально на движке OXR_CoC, есть там конечно несколько проблемных моментов, но они прям в глаза не бросаются.
  4. Кто нибудь пробовал реализовать эти отражения на ЗП? @Anonim, получилось сделать(ЗП - r2), но вот незадача - когда вертишь головой, по краям камеры возникают такие полосы/искажения: Что с этим можно сделать? Если использовать в шейдере такой код: То этих полос нету, но тогда если на модель/геометрию не попадает свет - отражение бьётся, иногда в отражении просто дырки - а иногда всё побито... ->
  5. Ну для воды тогда как минимум придется вектора резать получаемые из-за того что вода не пишется в буфер глубины (В ЗП покрай мере.)
  6. Нормалек. Качество не ахти, но для сталка пойдет. Правда, обозначенный выше алгоритм трассировки активно пропускает мелкие объекты, такие как провода, листва и пр. Да и не только мелкие. Хотя и достаточно быстр. Но все равно 6 итераций - мало, лучше хотя бы с десяток. Марш луча лучше делать в скринспейсе, т.е. по пикселям, а не в мировых или видовых координатах. Нормаль для воды можно не переводить в пространство касательных и не делать лишних умножений матриц, потому как вода всегда расположена горизонтально.
  7. Та же беда и под ЗП r3-r4, пытался переписать - не взлетает, говорит не порядок с вектором в SSLR, там как минимум "tex2D" не используется, переписывал на примерах из шейдеров, но ему не нравится..( Да и с r2 на ЗП тоже непорядок, сделал из репо - лужа есть, при чём она постоянна, не зависит от дождя, отражение вроде есть, но при разных углах взгляда артефактит дико. Да ещё - лужа есть, идёт дождь или нет, но афальт всегда стоит сухой, так же с дождём или без. Или я может в репо что-то упустил? ************************************************************************************************************** В общем, что сделал: движок "OXR_CoC", из вышеуказанного репозитория всё по SSLR перетянул сначала для r2, потом сделал тоже самое для r3-r4, с небольшими изменениями под эти рендеры(оказалось больше файлов где надо добавить дополнительные аргументы, чем у r2), движок скомпилил. По шейдерам для r2 сделал всё так же, как в репозитории, различий много не увидел, для r3-r4 пытался переписать - не вышло, не взлетает. На r2.5 вот такие получились "Типа лужи".
  8. @Anonim, это для R2 ТЧ. А в R3 ЧН я впух. Там код шейдеров другой.
  9. @Anonim, в Кризис-1 были реально объёмные облака, однако они были динамические. ФПС это не садило. Может пойти по тому же пути, как Крайтек? В Сталкере кто то даже делал объёмный туман - не помню что за мод. Это же почти тоже самое, как в Кризис-1. А эта объёмность есть в оригинале, в ЗП и ЧН точно, в зоне аномалий наблюдается туман. https://sun9-56.userapi.com/c855736/v855736586/86f72/kMsfApP8PoE.jpg
  10. Я пытался реализовать подобное решение, но без хороших результатов. Я думаю, что объемные облака и рендеринг скайбоксов в реальном времени могут действительно улучшить графику.
  11. 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 фпс. Ну и конечно давайте делитесь своими успехами по этой теме. Может быть есть более лёгкие альтернативы.
  12. @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); ........
  13. Очень хороший учебник. Спасибо) У меня вопрос, как я могу применить отражения только к воде?
  14. Как и обещал, разбор полётов по 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
  15. Привет всем, недавно задался вопросом реализации бликов like battlefield, наткнулся на статью: John Chapman Pseudo Lens Flares Демонстрационное видео мне понравилось, посему взялся за реализацию прямо по статье. Вот что вышло у меня: клик Собтсвенно, а как оно делается на сталкере, весь код приведу ниже с пояснением. Шейдер Treshold/Downsample, так как реализация в статье не подходит для сталкера, пришлось делать совсем иначе, на выходе почти идентичный результат. А что он делает? Говоря "поруски", отбрасывает пиксели с низкой яркостью оставляя только светлые участки, т.е. те участки которые и будут учавствовать в создании призраков и гало эффекта. Шейдер можно сказать необходимый, его можно использовать и для эффекта Dirty Lens, похожим способом и блум пилится и ещё много чего. Из входных данных, это люминанс вектор и rt_Generic_0(сцена до фазы combine). Пишется всё это дело в новый рендер таргет, который мы дальше будем использовать для генерирования бликов. Терь сам шейдер генерирующий блики. Входные данные: -ранее созданный рендер таргет downsample, "обозванный" samplerTreshold -1D текстура, в нашем случае фейковая, т.к. нельзя в dds сохранить текстуру с высотой в один пиксель, у меня она 256x4. Используется она для окрашивания бликов. Всё это тоже пишется в новый РТшник. Терь нужно "пустить под блюр" сгенерированные блики, обычно я это делаю незамысловатым Gauss блюром, но в сей раз хотел испробовать что-нибудь новенькое. На самом деле я не ручаюсь за правильность работы этого шейдера , так как не выводил его на результ для проверки. Чтобы перестраховаться можно использовать проверенный блюр, код будет прямо под этим. Тут Gauss. Входные параметры: -семплер обречённый на блюр -текстурные координаты -сила блюра (почему в int? потомучто я всегда его использую только в цикле и как сила блюра у меня выступает кол-во оборотов цикла, к тому же значение динамическое) for ( int i=0; i<BLUR_SAMPLES; i++ ) { outColor =Gauss(samplerBlur,texCoord,i,false); } -бул значение для юза оптимизированного блюра Примечание: по сути, юниформ screen_res здесь не так важен и можно заменить универсальной константой 1024.f В идеале, конечно, я бы и Dawnsample обрёк на блюр, но переделывать было уже лень. Ну и последняя фаза комбайн с основным изображением. Не стал парится с SturBurst эффектом, оставил статичным, оно и так прилично выглядит, DirtyLens Тоже не стал делать, так как у меня это отдельная история, хотя смешивать его тоже в этом шейдере буду. Ну вроде всё. Надеюсь кому-нибудь пригодится.
  16.  

AMK-Team.ru

×
×
  • Create New...