Наше комьюнити:   OpenGL Shader Lab  •  Half-Life FX  •  Форум  
HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > Цветовая аберрация в преломлениях
Рисуем мыльные пузыри
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 XaeroX
Rainbow Dash

Дата регистрации: Oct 2005
Проживает: Новосибирск
Сообщений: 26907
Нанёс повреждений: 460 ед.
Возраст: 30

Рейтинг



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


Цветовая аберрация в преломлениях

Если мы хотим сделать по-настоящему красивое преломление, нам нужно учитывать тот факт, что в природе белый свет состоит из лучей с разной длиной волны, и каждый отклоняется на разный угол при преломлении. Простой пример - призма, разлагающая белый свет на спектр. Мы попробуем смоделировать такие преломления.
Для начала рассмотрим обычное монохроматическое преломление. В первую очередь обратим внимание на тот факт, что в природе не бывает поверхностей, полностью пропускающих свет - часть его всегда отражается. То есть нам требуется рассчитать отраженный и преломленный векторы для каждой вершины, на основе которых мы получим координаты текстуры. Для этого есть стандартные библиотечные функции refract и reflect. Коэффициент преломления возьмем постоянным и равным 0.1:

Cg Vertex Shader:
struct VertIn
{
    float4 pos : POSITION;
    float4 normal : NORMAL;
    float2 tex0 : TEXCOORD0;
    float4 color : COLOR;
};

struct VertOut
{
    float4 pos : POSITION;
    float4 reflectVec : TEXCOORD0;
    float4 refractVec : TEXCOORD1;
    float4 fresnelTerm : COLOR;
};

// fresnel approximation
fixed fast_fresnel(float3 I, float3 N, float3 fresnelValues)
{
    fixed power = fresnelValues.x;
    fixed scale = fresnelValues.y;
    fixed bias = fresnelValues.z;
    return bias + pow(1.0 - dot(I, N), power) * scale;
}

VertOut main(VertIn vin)
{
    VertOut vout;
    vout.pos = mul(glstate.matrix.mvp, vin.pos);
    
    float3 eyeToVert = normalize(mul(glstate.matrix.modelview[0],vin.pos).xyz);
    float3 normal = normalize(mul(glstate.matrix.invtrans.modelview[0],vin.normal).xyz);
    
    float4 refractVec = float4(refract(eyeToVert, normal, 0.1), 1);
    float4 reflectVec = float4(reflect(eyeToVert, normal), 1);
    
    vout.reflectVec = mul(glstate.matrix.texture[0], reflectVec);
    vout.refractVec = mul(glstate.matrix.texture[1], refractVec);
    
    // calculate the fresnel reflection
    vout.fresnelTerm = fast_fresnel(-eyeToVert, normal, float3(5.0, 1.0, 0.0));
    
    return vout;
}


У нас есть два варианта: использовать кубические карты окружения или обычные 2D-текстуры, снимаемые с экрана. В первом случае не нужно дополнительное преобразование по матрицам текстуры, цель которого - убрать перспективное преобразование. Я выбрал второй способ. Итак, в пиксельном шейдере нам нужно получить цвет отражения и преломления и объединить их.
Cg Pixel Shader:
struct VertOut
{
    float4 pos : POSITION;
    float4 reflectVec : TEXCOORD0;
    float4 refractVec : TEXCOORD1;
    float4 fresnelTerm : COLOR;
};

struct FragOut
{
    float4 col : COLOR;
};

FragOut main(VertOut fin,
uniform sampler2D reflectMap : TEXUNIT0,
uniform sampler2D refractMap : TEXUNIT1)
{
    FragOut fout;
    
    float3 refractColor = tex2Dproj(refractMap, fin.refractVec).rgb;
    float3 reflectColor = tex2Dproj(reflectMap, fin.reflectVec).rgb;
    float3 reflectRefract = lerp(refractColor, reflectColor, fin.fresnelTerm.xyz);
    
    fout.col = float4(reflectRefract, 1.0);
    return fout;
}



Вот как это выглядит:


Теперь добавим эффект аберрации лучей. Все, что для этого требуется - рассчитать три разных вектора преломления (для красного, зеленого и синего компонента света) с разными коэффициентами преломления.
Cg Vertex Shader:
struct VertIn
{
    float4 pos : POSITION;
    float4 normal : NORMAL;
    float2 tex0 : TEXCOORD0;
    float4 color : COLOR;
};

struct VertOut
{
    float4 pos : POSITION;
    float4 reflectVec : TEXCOORD0;
    float4 refractVecR : TEXCOORD1;
    float4 refractVecG : TEXCOORD2;
    float4 refractVecB : TEXCOORD3;
    float4 fresnelTerm : COLOR;
};

// fresnel approximation
fixed fast_fresnel(float3 I, float3 N, float3 fresnelValues)
{
    fixed power = fresnelValues.x;
    fixed scale = fresnelValues.y;
    fixed bias = fresnelValues.z;
    return bias + pow(1.0 - dot(I, N), power) * scale;
}

VertOut main(VertIn vin)
{
    VertOut vout;
    vout.pos = mul(glstate.matrix.mvp, vin.pos);
    
    float3 eyeToVert = normalize(mul(glstate.matrix.modelview[0],vin.pos).xyz);
    float3 normal = normalize(mul(glstate.matrix.invtrans.modelview[0],vin.normal).xyz);
    
    float4 reflectVec = float4(reflect(eyeToVert, normal), 1);
    float4 refractVecR = float4(refract(eyeToVert, normal, 0.15), 1);
    float4 refractVecG = float4(refract(eyeToVert, normal, 0.10), 1);
    float4 refractVecB = float4(refract(eyeToVert, normal, 0.05), 1);
    
    vout.reflectVec = mul(glstate.matrix.texture[0], reflectVec);
    vout.refractVecR = mul(glstate.matrix.texture[1], refractVecR);
    vout.refractVecG = mul(glstate.matrix.texture[1], refractVecG);
    vout.refractVecB = mul(glstate.matrix.texture[1], refractVecB);
    
    // calculate the fresnel reflection
    vout.fresnelTerm = fast_fresnel(-eyeToVert, normal, float3(5.0, 1.0, 0.0));
    return vout;
}


В пиксельном шейдере нам нужно взять соответствующие цветовые компоненты по векторам преломления в экранной текстуре, и объединить их в один цвет преломления. А далее все так же - объединяем его с цветом отражения.
Cg Pixel Shader:
struct VertOut
{
    float4 pos : POSITION;
    float4 reflectVec : TEXCOORD0;
    float4 refractVecR : TEXCOORD1;
    float4 refractVecG : TEXCOORD2;
    float4 refractVecB : TEXCOORD3;
    float4 fresnelTerm : COLOR;
};

struct FragOut
{
    float4 col : COLOR;
};

FragOut main(VertOut fin,
uniform sampler2D reflectMap : TEXUNIT0,
uniform sampler2D refractMap : TEXUNIT1)
{
    FragOut fout;
    
    float3 refractColor;
    refractColor.r = tex2Dproj(refractMap, fin.refractVecR).r;
    refractColor.g = tex2Dproj(refractMap, fin.refractVecG).g;
    refractColor.b = tex2Dproj(refractMap, fin.refractVecB).b;
    
    float3 reflectColor = tex2Dproj(reflectMap, fin.reflectVec).rgb;
    float3 reflectRefract = lerp(refractColor, reflectColor, fin.fresnelTerm.xyz);
    
    fout.col = float4(reflectRefract, 1.0);
    return fout;
}


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


В примере нажмите пробел для включения и выключения аберрации. Само собой, требуется поддержка вторых шейдеров.

Вложение: chab.zip (45.1 кб)
Этот файл был скачан 1238 раз.
XaeroX проверил это вложение на вирусы 10-12-2005 в 08:18

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'

Сообщить модератору | | IP: Записан
Сообщение: 1814
Метки: мешок с сахаром

Старое сообщение 10-12-2005 08:16
-
BUzer
Pills here!

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

Рейтинг



Само преломление рулит, правда я не понял прикола с цветовой абберацией.. Ну добавляется какая-то красная подсветка.. В роли игрока, мне было-бы пофигу

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

Старое сообщение 10-12-2005 08:32
- За что?
 XaeroX
Rainbow Dash

Дата регистрации: Oct 2005
Проживает: Новосибирск
Сообщений: 26907
Нанёс повреждений: 460 ед.
Возраст: 30

Рейтинг



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


BUzer ты запусти пару мыльных пузырей и посморти Там идет разложение света на спектр при преломлении. Я конечно не ручаюсь, что мой вариант суперреалистичен, но что-то похожее имитирует.

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'

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

Старое сообщение 10-12-2005 08:50
-
 XaeroX
Rainbow Dash

Дата регистрации: Oct 2005
Проживает: Новосибирск
Сообщений: 26907
Нанёс повреждений: 460 ед.
Возраст: 30

Рейтинг



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


Ну вот может на чайнике лучше видно, что дает аберрация

Вложение: chab2.zip (46.0 кб)
Этот файл был скачан 1137 раз.

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'

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

Старое сообщение 10-12-2005 09:07
-
Security
Flamberg user

Дата регистрации: Oct 2005
Проживает: spb
Сообщений: 467
Возраст: 27

Рейтинг



XaeroX, а в чём прикол? В отражении справа на лево?

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

Старое сообщение 10-12-2005 09:57
- За что?
 XaeroX
Rainbow Dash

Дата регистрации: Oct 2005
Проживает: Новосибирск
Сообщений: 26907
Нанёс повреждений: 460 ед.
Возраст: 30

Рейтинг



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


Security специально для тебя - ЛОПАТА!

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'

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

Старое сообщение 10-12-2005 10:09
-
Security
Flamberg user

Дата регистрации: Oct 2005
Проживает: spb
Сообщений: 467
Возраст: 27

Рейтинг



Понял. От меня тебе - СТРУЧОК!

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

Старое сообщение 10-12-2005 10:38
- За что?
 XaeroX
Rainbow Dash

Дата регистрации: Oct 2005
Проживает: Новосибирск
Сообщений: 26907
Нанёс повреждений: 460 ед.
Возраст: 30

Рейтинг



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


А, не... Правильнее сказать: РАДЕОН
только вот хз почему

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'

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

Старое сообщение 10-12-2005 10:39
-
Security
Flamberg user

Дата регистрации: Oct 2005
Проживает: spb
Сообщений: 467
Возраст: 27

Рейтинг



Вот и я ничего не понял.

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

Старое сообщение 10-12-2005 10:50
- За что?
Ku2zoff
Юзер (типа моддер)

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 4077
Возраст: 26

Рейтинг



Мне кажется, на радеонах мало что нормально пашет. У меня например нету теней в хлфх. И вообще у меня хлфх вылетает, когда подбираешь оружие или батарейку. Когда клиента заменяешь на клиента обычной халфы - всё работает

__________________
Вы всё ещё не пьёте? Тогда мы идём к вам!

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

Старое сообщение 06-05-2007 10:22
- За что?
 Skaarj
Ага, вот эти пони!

Дата регистрации: Aug 2006
Проживает: Twisting Nether
Сообщений: 1589
Нанёс повреждений: 2 ед.

Рейтинг



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


Понравилось, играюсь подставляя различные картинки.

Добавлено сегодня в 15:00:

Вот только если взять шар, то в центре хроматической абберации быть не должно, там свет никак не переломляется, а у тебя всё равномерено разложенно по цветам вне зависимости от улов переломленя.

Добавлено сегодня в 16:34:

Ещё раз глянул, всё ок, по центру аберрации нету.

[ Вложение ]
untitled-1.jpg

__________________

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

Старое сообщение 06-05-2007 13:34
-
Alerman
Epsilon's Ally
Девойс

Дата регистрации: Jul 2006
Проживает: Раменский район Московской области...
Сообщений: 440
Возраст: 27

Рейтинг



Цитата:
Ku2zoff писал:
Когда клиента заменяешь на клиента обычной халфы - всё работает
Хм... может и мне попробовать...

__________________
Я за Ленина, за мир и за СССР, НО я против сталина, против тех кто "наводит мир" силой, и против Кремля!

За это сообщение Alerman получил предупреждение за флуд

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

Старое сообщение 07-05-2007 03:58
- За что?
FiEctro
Диванные войска

Дата регистрации: Aug 2006
Проживает: Зеленый форум
Сообщений: 8396
Возраст: 25

Рейтинг



Ku2zoff
>> Когда клиента заменяешь на клиента обычной халфы - всё работает

Странно , по теории если заменить клиентку мода на стандартную , то новшества врятли будут работать , если только они не на сервере

__________________
Для организации коллектива надо уметь ссать в уши виртуозно (с) Raid

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

Старое сообщение 28-05-2007 18:41
- За что?
WoRKER
Революционер
Девойс

Дата регистрации: Jul 2007
Проживает: Калуга, Калужская область
Сообщений: 116
Возраст: 25

Рейтинг



Эй!

А можно что-то фееричное?

__________________
Boom.
Скоро на Ваших мониторах.

За это сообщение WoRKER получил предупреждение за флуд

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

Старое сообщение 05-07-2007 15:37
- За что?
Тема: (Опционально)
Ваш ответ:



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


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

Временная зона GMT. Текущее время 05:28. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > Цветовая аберрация в преломлениях
Рисуем мыльные пузыри
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

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

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

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

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

Рейтинг@Mail.ru