Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Проекты > Проекты C++

Ответ
 
Опции темы
Старый 21.06.2009, 03:01   #1
Genius
Знающий
 
Аватар для Genius
 
Регистрация: 02.11.2007
Сообщений: 255
Написано 27 полезных сообщений
(для 43 пользователей)
Статья:Parallax Mapping

Вобщем я раскажу как сделать Parallax Mapping технику на языке HLSL(High Level Shader Language).

Для начала,что такое Parallax Mapping? Parallax Mapping это техника нам позваляет сделать из простого плоского полигона имитацию высоко полигональной модели.

Пример Normal Mapping:

Пример Parallax Mapping:


Для постраения этой самой "высоко полигональной модели" необхадима Height мапа,которую мы можем получить с помощью таких тулзов как CrazyBump,3dsMax,Maya.
Выглидит она вот таким образом:



И так,начнём наш шейдер:

float4x4 World : WORLD; // Мировая матрица трансформации модели
float4x4 View  : VIEW; // Видовая матрица
float4x4 Proj  : PROJECTION; // Матрица проекции

// Input стрктура вершиного шейдера
struct VS_INPUT
{
  float3 position : POSITION0; // Не трансформированая позиция вершины
  float3 normal   : NORMAL0; // Нормаль вершины
  float2 texcoord : TEXCOORD0; // Текстурные координаты
  float3 tangent  : TANGENT0; // Тангент вершины
  float3 binormal : BINORMAL0; // Би-нормаль вершины
};

// Оутпат структура вершиного шейдера
struct VS_OUTPUT
{
    float4 position : POSITION0; // Трансформированая позиция вершины
    float2 texcoord : TEXCOORD0; // Текстурные координаты : Для Pixel-Shader
    float3 normal   : TEXCOORD2;  // Нормаль : Для Pixel-Shader
    float3 tangent  : TEXCOORD3; // Тангент : Для Pixel-Shader
    float3 binormal : TEXCOORD4; // Би-нормаль : Для Pixel-Shader
    float3 position2: TEXCOORD5; // Мировая позиция вершины : Для Pixel-Shader
};

// Вершиный шейдер:
VS_OUTPUT vs_main(VS_INPUT In)
{
     VS_OUTPUT Out = (VS_OUTPUT)0;
     Out.position = mul(In.position,World); /* домножаем позицию вершины на 
     мировую матрицу трансформации
     */
     Out.position2 = Out.position; // Сохраняем её так-как она нам ещё понадобится
     Out.position = mul(mul(Out.position,View),Proj); /* Домнажаем позицию 
     на матрицу вида и проекции*/
     Out.normal = normalize(mul(In.normal,World)); /* Доманажаем нормаль на 
     мировую матрицу и нормализуем */
     Out.tangent = normalize(mul(In.tangent,World)); /* Доманажаем тангент на 
     мировую матрицу и нормализуем */
     Out.binormal = normalize(mul(In.binormal,World)); /* Доманажаем би-нормаль на 
     мировую матрицу и нормализуем */
     Out.texcoord = In.texcoord; // сохраняем текстурные координаты
     return Out; // Finish :)
}

float3 cameraPos; // позиция камеры
float3 lightPos; // позиция источника
float lightRadius; // радиус источника
sampler DiffuseMap : register(s0); //фиксируем семплер дефьюзной карты на 0 слот
sampler NormalMap : register(s1); //фиксируем семплер нормаль карты на 1 слот
sampler HeightMap : register(s2); //фиксируем семплер карты высот на 2 слот
float parallaxIntensity = 0.05f; /* интенсивность паралакса,
больше ставить не советую :-) ,разве что поменьше. */


// Пиксельный шейдер 
float4 ps_main(VS_OUTPUT In) : COLOR0
{
      float4 Out = 0;
      float heightValue = tex2D(HeightMap,In.texcoord).r; // Получаем height виличину текущего пикселя
      float2 offsetCoord=In.texcoord;
      
      float3x3 tbn; // Трёх мерная матрица Tangent Space
      tbn[2] = In.normal;
      tbn[0] = In.tangent;
      tbn[1] = In.binormal;
      
      float3 viewVec = normalize(mul(cameraPos - In.position2.xyz,tbn)); /* получаем видовой вектор ,
      по не замысловатой формуле (Camera Position  - World Position) * TangetSpace ,
      и нормализуем его */

      float2 parallaxSize = parallaxIntensity * float2(2, -1);
      offsetCoord += viewVec.xy * (heightValue * parallaxSize.x + parallaxSize.y);// получаем новые текстурные координаты
     
     /* так всё мы имеем нужные нам новые текстурные координаты 
     далле всё как в простом нормал меппинге только выборки 
     делаем по новым текстурным координатам!*/


      float4 color = tex2D(DiffuseMap,offsetCoord); // цвет
      float3 normal = tex2D(NormalMap,offsetCoord).xyz * 2 - 1; // компенсирующая нормаль
      normal = normalize(mul(normal,tbn)); // переводим её в Tangent Space
    
      float3 lightAng = normalize(lightPos - In.position2.xyz); /* вычисляем позицию 
      источника света отнасительно мировой позиции вершины*/
      float atten   = saturate(1.0f - distance(In.position2.xyz, lightPos) / lightRadius); // аттенуация источника(затухание)
      float3 NdL = saturate(dot(lightAng,normal));  // Dot product векторов lightAng,normal
      
      Out = color * NdL * atten; Финальный цвет пикселя

      return Out; // Finish :-) 
}
Фух,вроде всё учёл,если нет,то я старался учесть .
На последок скажу,что Parallax Mapping не единственная техника в своём роде,есть ещё и расширения типа Step Parallax Mapping,Parallax Occlusion Mapping и д.р.
Спасибо за внимание! И до новых встреч!
Матереалы по Parallax Mapping расширениям:
- Step Parallax Mapping http://graphics.cs.brown.edu/games/S...lax/index.html
- Parallax Occlusion Mapping - Можно посмотреть либо в Direct3D SDK,либо в AMD Render Monkey, http://ati.amd.com/developer/kri06/K...archuk-POM.pdf.
- Relief Mapping http://developer.download.nvidia.com...gems3_ch18.pdf
- Parallax Mapping Steps3D http://steps3d.narod.ru/tutorials/pa...-tutorial.html
Так же:
- HLSL http://ru.wikipedia.org/wiki/HLSL

Последний раз редактировалось Genius, 21.06.2009 в 20:45.
(Offline)
 
Ответить с цитированием
Эти 6 пользователя(ей) сказали Спасибо Genius за это полезное сообщение:
-=Jack=- (23.06.2009), ABTOMAT (21.06.2009), newman (21.06.2009), Nex (03.07.2009), rr333 (21.07.2009), sSwSs (21.06.2009)
Старый 21.06.2009, 03:03   #2
Genius
Знающий
 
Аватар для Genius
 
Регистрация: 02.11.2007
Сообщений: 255
Написано 27 полезных сообщений
(для 43 пользователей)
Ответ: Статья:Parallax Mapping

Похоже немного разделом ошибся
(Offline)
 
Ответить с цитированием
Старый 21.06.2009, 12:40   #3
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений
(для 1,460 пользователей)
Ответ: Статья:Parallax Mapping

все здорово, но вот принцип лежащий в основе описал бы, чтобы не копипаст люди делали, а могли поправить/изменить при случае
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ffinder за это полезное сообщение:
Genius (21.06.2009), Taugeshtu (21.06.2009)
Старый 21.06.2009, 14:14   #4
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Статья:Parallax Mapping

все здорово, но вот принцип лежащий в основе описал бы, чтобы не копипаст люди делали, а могли поправить/изменить при случае
И правда, хотелось бы подробностей. Ну а так впечатляет.
Похоже, у МоКи есть достойные последователи.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Genius (21.06.2009)
Старый 21.06.2009, 15:06   #5
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Статья:Parallax Mapping

Parallax Mapping это техника нам позваляет сделать из простого плоского полигона имитацию высоко полигональной модели.
некорректно, он просто делает иллюзию выдавливания по хейт мапе.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Genius (21.06.2009)
Старый 21.06.2009, 15:27   #6
Genius
Знающий
 
Аватар для Genius
 
Регистрация: 02.11.2007
Сообщений: 255
Написано 27 полезных сообщений
(для 43 пользователей)
Ответ: Статья:Parallax Mapping

Ну как видите,что то не учёл,следующий раз обязательно учту ,сегодня\завтро думаю написать про Parallax Occlusion Mapping.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (21.06.2009)
Старый 21.06.2009, 17:53   #7
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: Статья:Parallax Mapping

Лучше этот семпл дополни описанием принципов работы прежде чем за новый браться... А то будет куча объедков, и никакого понимания вопроса у новичков вроде меня...
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Taugeshtu за это полезное сообщение:
ABTOMAT (21.06.2009), Genius (21.06.2009), Mr_F_ (21.06.2009)
Старый 21.06.2009, 18:02   #8
Genius
Знающий
 
Аватар для Genius
 
Регистрация: 02.11.2007
Сообщений: 255
Написано 27 полезных сообщений
(для 43 пользователей)
Ответ: Статья:Parallax Mapping

Сообщение от Ize'g0re Посмотреть сообщение
Лучше этот семпл дополни описанием принципов работы прежде чем за новый браться... А то будет куча объедков, и никакого понимания вопроса у новичков вроде меня...
А что конкретно не понятно? Я просто не знаю же,а так буду знать и исправлю.
(Offline)
 
Ответить с цитированием
Старый 21.06.2009, 18:05   #9
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Статья:Parallax Mapping

да нече не понятно, ты должен каждый шаг расписывать очень подробно, а не одной строчкой комментария, посмотри как другие статьи пишут...
(Offline)
 
Ответить с цитированием
Старый 21.06.2009, 18:10   #10
jimon
 
Сообщений: n/a
Ответ: Статья:Parallax Mapping

Genius
распиши как тут http://steps3d.narod.ru/tutorials/pa...-tutorial.html , тогда некоторые поймут
но для хорошей статьи надо еще подробнее разжевать
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
Genius (21.06.2009), impersonalis (21.06.2009)
Старый 21.06.2009, 18:46   #11
Genius
Знающий
 
Аватар для Genius
 
Регистрация: 02.11.2007
Сообщений: 255
Написано 27 полезных сообщений
(для 43 пользователей)
Ответ: Статья:Parallax Mapping

Сообщение от jimon Посмотреть сообщение
Genius
распиши как тут http://steps3d.narod.ru/tutorials/pa...-tutorial.html , тогда некоторые поймут
но для хорошей статьи надо еще подробнее разжевать
Я расписал на доступном языке,но вот эту ссылку для тех кто хочет вникнуть добавлю.


Да и в большенстве случаеш новички меньше читают,больше копипастят.

З.Ы. Немного привёл в порядок статью.
(Offline)
 
Ответить с цитированием
Старый 21.06.2009, 18:54   #12
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Статья:Parallax Mapping

Да и в большенстве случаеш новички меньше читают,больше копипастят.
с чего такой вывод ?
(Offline)
 
Ответить с цитированием
Старый 21.06.2009, 18:55   #13
Genius
Знающий
 
Аватар для Genius
 
Регистрация: 02.11.2007
Сообщений: 255
Написано 27 полезных сообщений
(для 43 пользователей)
Ответ: Статья:Parallax Mapping

Сообщение от NitE Посмотреть сообщение
с чего такой вывод ?
Сам так делал раньше...
(Offline)
 
Ответить с цитированием
Старый 21.06.2009, 18:57   #14
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Статья:Parallax Mapping

тогда пиши "да и в большенстве случаев я меньше читал, больше копипастил"
(Offline)
 
Ответить с цитированием
Старый 21.06.2009, 19:44   #15
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: Статья:Parallax Mapping

Ты >< все новички.
Я не считаю себя новичком в блитце, но в шейдерах я новичок. Несмотря на это, я стремлюсь разобраться, а не скопипастить чужой шейдер "лишь бы работало".

Я расписал на доступном языке
Fail. Объясни мне пожалуйста поподробнее вот это:

Out.position = mul(In.position,World); /* домножаем позицию вершины на 
     мировую матрицу трансформации
     */
     Out.position2 = Out.position; // Сохраняем её так-как она нам ещё понадобится
     Out.position = mul(mul(Out.position,View),Proj); /* Домнажаем позицию 
     на матрицу вида и проекции*/
     Out.normal = normalize(mul(In.normal,World)); /* Доманажаем нормаль на 
     мировую матрицу и нормализуем */
     Out.tangent = normalize(mul(In.tangent,World)); /* Доманажаем тангент на 
     мировую матрицу и нормализуем */
     Out.binormal = normalize(mul(In.binormal,World)); /* Доманажаем би-нормаль на 
     мировую матрицу и нормализуем */
     Out.texcoord = In.texcoord; // сохраняем текстурные координаты
     return Out; // Finish :)
Вот я не понимаю, для чего нужны все эти домножения, я не вижу цельной картины. Вообще ничего не понимаю, что откуда и куда приходит, и главное - зачем.
Считай, что ты ничего не объяснил, просто выложил код шейдера с незначительными комментариями. Объясни пожалуйста лично мне принцип, каким образом это делается? Пока ты не решишь эту задачу - не заслужишь моего "спасибо" а заодно оправдания слова "Статья" в заголовке темы.
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Статья pax FAQ 7 27.06.2011 04:13
Mapping -> Flattern Mapping Dzirt 3D Моделирование 7 13.11.2009 16:20
Parallax+Bump+Specular (Прозьба затестить). moka Болтовня 35 21.02.2008 19:25
Bump Mapping DRAG 3D-программирование 6 27.11.2006 23:30


Часовой пояс GMT +4, время: 17:42.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com