Jump to content

Recommended Posts

DDamian724    18

Очень хороший учебник. Спасибо)

У меня вопрос, как я могу применить отражения только к воде?

  • Полезно 1

Share this post


Link to post
Share on other sites
Anonim    672

@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.

Код примерно такой будет:

 

Скрытый текст

#ifndef SSLR_header_h
  #define SSLR_header_h

float3 SSLR(float3 refl_vec)
{
	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 refl_img;	  
}

#endif

 

 

И в шейдере воды:

#include "SSLR_header.h"
........
  half4 main(){
........
half3         env               = SSLR(vreflect);
........

 

  • Like 1
  • Полезно 3

Share this post


Link to post
Share on other sites
Expropriator    1,837

@Anonim, это для R2 ТЧ. А в R3 ЧН я впух. Там код шейдеров другой.


andreyholkin.gif

rod_cccp.gif

 

Share this post


Link to post
Share on other sites
Romann    487
Posted (edited)
В 04.10.2019 в 00:52, Expropriator сказал:

Там код шейдеров другой

Та же беда и под ЗП r3-r4, пытался переписать - не взлетает, говорит не порядок с вектором в SSLR, там как минимум "tex2D" не используется, переписывал на примерах из шейдеров, но ему не нравится..(

Да и с r2 на ЗП тоже непорядок, сделал из репо - лужа есть, при чём она постоянна, не зависит от дождя, отражение вроде есть, но при разных углах взгляда артефактит дико. Да ещё - лужа есть, идёт дождь или нет, но афальт всегда стоит сухой, так же с дождём или без. Или я может в репо что-то упустил?

**************************************************************************************************************

В общем, что сделал: движок "OXR_CoC", из вышеуказанного репозитория всё по SSLR перетянул сначала для r2, потом сделал тоже самое для r3-r4, с небольшими изменениями под эти рендеры(оказалось больше файлов где надо добавить дополнительные аргументы, чем у r2), движок скомпилил. По шейдерам для r2 сделал всё так же, как в репозитории, различий много не увидел, для r3-r4 пытался переписать - не вышло, не взлетает. 

На r2.5 вот такие получились "Типа лужи".

Edited by Romann

Машина: проц. Intel® Core™ i5-2430M CPU 2.40GHz ,ОЗУ 6,00Гб ,видео 2 Гб,Win7х64

 

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить?

                                                                                                                                                                          © Болотный Доктор

Share this post


Link to post
Share on other sites

  • Recently Browsing   0 members

    No registered users viewing this page.

AMK-Team.ru

×
×
  • Create New...