PMG

Форумы по созданию игр
Текущее время: 28 мар 2024 12:38

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Шейдер марева
СообщениеДобавлено: 22 сен 2010 13:26 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 44
Я сделал небольшой пиксельный шейдер марева:
Код:
float OffsetScale;
float fTime0_X;
sampler Texture0;
sampler Texture1;
float4 ps_main(float2 texCoord: TEXCOORD0) : COLOR
{
   // Read and scale the distortion offsets
   //float2 offset = tex3D(Texture1,float3(4*texCoord.x,4*texCoord.y+fTime0_X,0)).xy;
   //offset = ((offset*2.0)-1.0)*OffsetScale;
   
   float3 coord;
   coord.x = texCoord.x * 4;
   coord.y = texCoord.y * 4 + fTime0_X;
   coord.z = 0;
   
   float offset = tex2D(Texture1, coord);
   
   offset*=OffsetScale;
   
   return tex2D(Texture0,float2(texCoord.x+offset, texCoord.y+offset));
}


В этом коде OffsetScale = 0.025;
sampler Texture0 = моя сцена, в предыдущем Pass этого эффекта это была цель визуализации в которую я занес сцену.
sampler Texture1 = текстура шума, серых оттенков, как вроде мрамор.
fTime0_X - время для изменения координат текстуры.

Так вот в этом шейдере я все понимаю, и вот его скриншот:
Изображение

Но самое интересное когда я убираю из формулы OffsetScale, то есть вобще закоментирую ее в коде шейдера:
Код:
float offset = tex2D(Texture1, coord);
   
  // offset*=OffsetScale;
   
   return tex2D(Texture0,float2(texCoord.x+offset, texCoord.y+offset));


то изображения вобще не видно. Вот скриншот без OffsetScale:
Изображение

Вопрос - почему надо эта переменная OffsetScale в коде. И самое интересное почему она должна быть равна 0,025 - когда я ставлю в ней другие значение картинка искажаеться как в последнем скриншоте. Только надо 0,025. Почему,


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Шейдер марева
СообщениеДобавлено: 22 сен 2010 15:09 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
Все просто:
Из текстуры Texture1 берется значение offset
Код:
float offset = tex2D(Texture1, coord);
А т.к. там значения большие (от 0 до 1), то их нужно уменьшить,
Код:
offset*=OffsetScale;
чтобы получить небольшое итоговое смещение координат,
Код:
tex2D(Texture0,float2(texCoord.x+offset,texCoord.y+offset));
такое что выполняется: texCoord.x+offset примерно равно texCoord.x
Если не нравится коэф. 0.025, можно от него избавиться путем сильного затемнения текстуры с шумами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Шейдер марева
СообщениеДобавлено: 22 сен 2010 19:17 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 44
Ну хорошо, вот я пытался экспериментировать с OffsetScale. Стоит мне отклониться немного от его значения 0, 025 - картинка становиться искривленной. Вот скажем автор книги что писал этот пример - он же не мог сидеть сутки подбирать значение 0,025! Откуда то оно взялось! Можна как- то динамически в шейдере вычилисть этот коэффициент, может это пропорция какая- то, если пропорция то от чего пропорция. Мне вот до этого бы хотелось докопаться.

А во вторых вы говорите что там значения большие от 0 до 1 - изначально в offset до умножения на OffsetScale. Ну так а если текстура WRAP лежит у меня, то то что больше единицы все равно получиться что ляжет как вроде меньше единицы. Правльно же? Но почему то я понять этого не могу. Я не против как вы говорите этого значения 0,025. Мне интересно окуда именно 0,025! Фактически подобрать опытным путем это число невозможно. Так как оно вычисляеться?

Вот все понимаю в этом шейдере, но как автор вычислил 0,025 понять не могу!

Прошу прощения за мою непонятливость - я только начал изучать пиксельные шейдеры. Объясните как можно более подробно. Заранее благодарен.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB