netlib.narod.ru | < Назад | Оглавление | Далее > |
Уф, как много чтения. Надеюсь, у вас осталось еще немного энергии для выполнения небольшого задания. В этой главе много говорилось о наложении нормалей и наложении параллакса, но показана была только реализация карт нормалей. Теперь ваш черед реализовать наложение параллакса. Не беспокойтесь; это не очень трудно, после того, как вы уловите основную идею.
Прежде всего, вы должны понять, что каждый пиксель, производимый пиксельным шейдером, отображает интерполированные координаты текстур, передаваемые через вершины. Но если можно интерполировать и масштабировать координаты текстур, вы должны быть в состоянии перемещать их вокруг, в зависимости от местоположения зрителя. Это и есть основная идея наложения параллакса, проиллюстрированная на рис. 7.25.
Рис. 7.25 |
Чтобы получить этот эффект в вашем шейдере надо сначала определить текстуру высот (черная кривая линия на рисунке представляет высоту каждого пикселя). Просто добавьте ее после карты нормалей и используйте стандартные значения объекта выборки (линейная интерполяция). Теперь вы можете получить доступ к данным карты высот в пиксельном шейдере с помощью следующего кода:
float height = tex2D(heightTextureSampler, In.texCoord);
Здесь используется значение типа float, поскольку вам нужно значение высоты, а не цвет в карте высот (который в любом случае будет серым). Теперь вы должны вычислить смещение, которое образует данное значение высоты. Используйте очень малые значения, иначе наложение параллакса будет выглядеть плохо если эффект окажется слишком сильным. Базовый код для этого такой:
// Вычисляем смещение параллакса, parallaxAmount должно быть 0.05 или меньше float2 offsetTexCoord = In.texCoord + (height*parallaxAmount - parallaxAmount*0.6f) * normalize(In.viewVec);
И последняя вещь, которую надо сделать: вы должны для текстуры рассеивания и карты нормалей использовать offsetTexCoord вместо In.texCoord, и ваш эффект наложения параллакса должен заработать. Тонкая настройка не займет много времени; для упрощения тестирования используйте переменную FX Composer для parallaxAmount. Удачи. Если вы не справились с работой или столкнулись с проблемами, взгляните на шейдер ParallaxMapping.fx в каталоге содержимого для получения дополнительных подсказок.
netlib.narod.ru | < Назад | Оглавление | Далее > |