HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > Совершенствуем "эффект хромирования"
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34509
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Совершенствуем "эффект хромирования"

В Half-Life, как вы наверное знаете, определенные текстуры на моделях выглядят как бы хромированными - их текстурные координаты искажаются определенным образом. Фактически для искажения нужны: вектора, задающие направления (вправо и вверх) и нормаль к вершине. Нормаль вычисляется для каждой вершины при подготовке модели, и полученные значения хрома умножаются на текущие координаты текстуры.

Смоделируем этот процесс. Для этого мы напишем вершинную программу, производящую нужные вычисления, а нормаль передаем средствами OpenGL (для боксов в примере нормали генерируются автоматически).

Cg Vertex Shader:
1
struct VertIn
2
{
3
  float4 pos : POSITION;
4
  float3 normal : NORMAL;
5
  float3 tex0 : TEXCOORD0;
6
  float4 col : COLOR;
7
};
8
 
9
struct VertOut
10
{
11
  float4 pos : POSITION;
12
  float4 tex0 : TEXCOORD0;
13
  float4 col : COLOR;
14
};
15
 
16
VertOut main(VertIn vin)
17
{
18
  VertOut vout;
19
  float4 g_vecRight = float4( 1.0f, 0.0f, 0.0f, 0.0f );
20
  float4 g_vecUp = float4( 0.0f, 1.0f, 0.0f, 0.0f );
21
 
22
  vout.pos = mul(glstate.matrix.mvp, vin.pos);
23
  g_vecRight = mul(glstate.matrix.inverse.mvp, g_vecRight);
24
  g_vecUp = mul(glstate.matrix.inverse.mvp, g_vecUp);
25
 
26
  vout.tex0.x = vin.tex0.x * (dot(vin.normal, g_vecRight.xyz) + 1.0);
27
  vout.tex0.y = vin.tex0.y * (dot(vin.normal, g_vecUp.xyz) + 1.0);
28
  vout.col = vin.col;
29
  return vout;
30
}


Выглядит не очень красиво. Для более реалистичного эффекта нужно учесть микрорельеф поверхности попиксельно. Основные вычисления мы производим в пиксельной программе, а вершинная передает ей вектора направления (учтите: в вашей собственной игре нужно передавать вектора вручную, а не задавать как константы в шейдере!).
Вершинная программа выглядит просто:
Cg Vertex Shader:
1
struct VertIn
2
{
3
  float4 pos : POSITION;
4
  float3 normal : NORMAL;
5
  float2 tex0 : TEXCOORD0;
6
  float4 color : COLOR;
7
};
8
 
9
struct VertOut
10
{
11
  float4 pos : POSITION;
12
  float2 tex0 : TEXCOORD0;
13
  float3 tex1 : TEXCOORD1;
14
  float3 tex2 : TEXCOORD2;
15
  float4 color : COLOR;
16
};
17
 
18
VertOut main(VertIn vin)
19
{
20
  VertOut vout;
21
  float4 g_vecRight = float4( 1.0f, 0.0f, 0.0f, 0.0f );
22
  float4 g_vecUp = float4( 0.0f, 1.0f, 0.0f, 0.0f );
23
 
24
  vout.pos = mul(glstate.matrix.mvp, vin.pos);
25
  vout.tex1 = mul(glstate.matrix.inverse.mvp, g_vecRight).xyz;
26
  vout.tex2 = mul(glstate.matrix.inverse.mvp, g_vecUp).xyz;
27
  vout.tex0 = vin.tex0;
28
  vout.color = vin.color;
29
  return vout;
30
}


Пиксельный шейдер чуть сложнее - нам вначале нужно прочитать нормаль из тектуры - карты нормалей (мы привязали ее к юниту 1).
Cg Pixel Shader:
1
struct VertOut
2
{
3
  float4 pos : POSITION;
4
  float2 tex0 : TEXCOORD0;
5
  float3 tex1 : TEXCOORD1;
6
  float3 tex2 : TEXCOORD2;
7
  float4 color : COLOR;
8
};
9
 
10
struct FragOut
11
{
12
  float4 col : COLOR;
13
};
14
 
15
FragOut main(VertOut fin,
16
uniform sampler2D diffuseMap :TEXUNIT0,
17
uniform sampler2D normalMap :TEXUNIT1)
18
{
19
  FragOut fout;
20
 
21
  float2 tc;
22
  float4 normal = tex2D(normalMap, fin.tex0);
23
 
24
  //expand normal [0,1] -> [-1,1]
25
  normal.xyz = normal.xyz*2 - 1;
26
 
27
  tc.x = fin.tex0.x * (dot(normal.xyz, fin.tex1.xyz) + 1.0);
28
  tc.y = fin.tex0.y * (dot(normal.xyz, fin.tex2.xyz) + 1.0);
29
 
30
  fout.col = fin.color * tex2D(diffuseMap, tc);
31
  return fout;
32
}


Сравните два бокса в примере (справа - тот, что использует попиксельные нормали) и почувствуйте, так сказать, разницу! Нажатием кнопки мыши можно изменить используемый нормалмап. По умолчанию используется "пустой" нормалмап - фактически простая нормаль, поэтому картинка справа идентична левой.

Пример требует наличия поддержки вершинных и пиксельных шейдеров 2.0

__________________

Сообщить модератору | | IP: Записан
Сообщение: 30

Старое сообщение 17-10-2005 09:57
-
Format.com
Герой Ксенона

Дата регистрации: Oct 2005
Проживает: Минск
Сообщений: 136

Рейтинг



Вложение - unexpected end of archive.

Сообщить модератору | | IP: Записан
Сообщение: 31

Старое сообщение 17-10-2005 12:04
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34509
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Так, с аттачами вроде все исправил. Вот вложение. Кстати, я там изменил кое-что в шейдерах, теперь все правильнее.

Вложение: chrome.zip (201.9 кб)
Этот файл был скачан 1455 раз.
XaeroX проверил это вложение на вирусы 03-11-2005 в 09:47

__________________

Сообщить модератору | | IP: Записан
Сообщение: 35

Старое сообщение 17-10-2005 19:24
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Хороший хром
особенно 3 и 4 варианты.
Кстати тебе совет - сделай так, чтобы окошко нельзя было растягивать на весь экран, а то кубик пропадает.

Сообщить модератору | | IP: Записан
Сообщение: 36

Старое сообщение 17-10-2005 19:33
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34509
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Окошко растягивать можно, но так, чтобы пропорции соблюдались. Так что больше можно сделать при желании.

Вот я когда-то про такой хром и говорил на Half-Life.ru. Его можно без проблем сделать на world brush'ах в хл. Чем я вскоре и займусь

__________________

Сообщить модератору | | IP: Записан
Сообщение: 38

Старое сообщение 17-10-2005 19:36
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



XaeroX а нафига нужны хромированные браши? :confused:

Сообщить модератору | | IP: Записан
Сообщение: 39

Старое сообщение 17-10-2005 19:38
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34509
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Ну как нафига. Металлические конструкции. И потом, хром ведь можно накладывать как вторую текстуру. Красиво смотрится - сам же сказал

__________________

Сообщить модератору | | IP: Записан
Сообщение: 40

Старое сообщение 17-10-2005 19:43
-
BUzer
Pills here!

Группа: Опытный
Дата регистрации: Oct 2005
Проживает: Владивосток
Сообщений: 349
Возраст: 40

Рейтинг



Красиво. А что исходник не приложил?

Вот тоже че-нить подобное заиметь.. Кстати, а если не юзать cg, то под какое расширение лучше шейдер писать? arb_vertex_program? Или nv_ какой-нибудь?..

Сообщить модератору | | IP: Записан
Сообщение: 50

Старое сообщение 18-10-2005 10:47
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34509
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Я сг для примера написал (кстати, это и есть исходник. дело в шейдере, остальное любой сам допишет). Я арб юзаю, и тебе советую, если хочешь, чтобы на радеонах работало.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 52

Старое сообщение 18-10-2005 10:54
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



XaeroXвроде как бампом?
ну разве что так
просто я лично считаю, что важны не сами эффекты, а их гармонирование с окружающей средой.
как пример - мощнейщая детализация на ящике с убогой текстуркой 32х32 дает прямо противоположные впечатления.

Сообщить модератору | | IP: Записан
Сообщение: 54

Старое сообщение 18-10-2005 11:14
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34509
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


g-cont согласен. но в примере текстурки 64 х 64, и вроде ничего так смотрятся. А бамп здесь не при чем, разве что карта нормалей тоже используется, а по сути все разное.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 57

Старое сообщение 18-10-2005 11:36
-
Jumpdaphuckup!
Когда-то я здесь был

Дата регистрации: Nov 2005
Проживает: Україна / Харків
Сообщений: 128
Возраст: 36

Рейтинг



XaeroX а ты бы сделал вариант только с вертексными шейдерами

Сообщить модератору | | IP: Записан
Сообщение: 1099

Старое сообщение 12-11-2005 09:49
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34509
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Jumpdaphuckup! писал:
а ты бы сделал вариант только с вертексными шейдерами

как ты себе это представляешь?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 1102

Старое сообщение 12-11-2005 09:54
-
Jumpdaphuckup!
Когда-то я здесь был

Дата регистрации: Nov 2005
Проживает: Україна / Харків
Сообщений: 128
Возраст: 36

Рейтинг



XaeroX если б представлял, то не просил бы

Сообщить модератору | | IP: Записан
Сообщение: 1129

Старое сообщение 12-11-2005 14:49
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34509
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Jumpdaphuckup! вся идея основана именно на пиксельных шейдерах А вариант только на вертексных я там привел - смотри пример.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 1132

Старое сообщение 12-11-2005 15:00
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 17:41. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > Совершенствуем "эффект хромирования"
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024