Последние файлы

Статистика

Онлайн всего: 64
Гостей: 63
Пользователей: 1
Admin
Нас сегодня посетили:
Admin, pilya0503, kolesnikelmira32

Друзья сайта

В тылу врага - моды, аддоны и другое!
Скрипты, Графика, Шаблоны, Моды, Патчи, Ролевая - Всё для настоящего сталкера!Модляндия - страна модификаций
7

SSLR


  1. Описание
Такс, для начала создадим новый рендер таргет формата 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 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);

Посмотрим

HI9i-Ul8-Cp-YI.jpg

Вот так интереснее. Теперь найдём вектор взгляда на этот пиксель

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

Источник: https://www.amk-team.ru/forum/topic/14078-sslr/

Всего комментариев: 0
avatar
Дата публикации: 10.11.2019
Обновлено: 10.11.2019 в 08:35
Опубликовал: Admin

Популярное за месяц:

Обновленные темы:

OpenXRay [08:25]

Мы комментируем

17:35
Admin
Перевод от старой версии 1.56, не знаю, будут ли конфликты с новой версии, а так, да просто закинуть...
А перевод мода и сам мод просто закидывать в папку Mods?
11:25
Admin
Русский перевод встроен
мн, и где скачать русскую версию?..
22:35
Admin
нз
22:15
Ghosteron
Как раз, спасибо. Не хватало этого для моего замечательного друга.
10:31
vdvjjv
top mod
10000000 ЗВЁЗД ЭТОЙ ИГРЕ ВСЕМ РЕКОМЕНДУЮ!!!!!!!!!(:
18:00
aysapiens
Значит, так, - на чистой игре ver. 1.0006 вылетает при попытке загрузить сохранение. Но я разобрался...
21:14
Admin
Возможно, попробуй ;)
21:08
Alter24
Нашёл один трейнер хороший к ней,поиграл ту миссию до почти 15 волны зомби и она вылетела на рабочий...
16:30
Admin
Надо было пару скриншотов сделать, я бы выложил сюда)
14:49
Alter24
Пипец игруха.Пошла отлично,играть можно,но я на второй миссии всё время умираю,устал уже зомбарей ва...
17:13
Admin
Хорошо, если будешь играть, отпишись, работает или нет)