Если мы хотим сделать по-настоящему красивое преломление, нам нужно учитывать тот факт, что в природе белый свет состоит из лучей с разной длиной волны, и каждый отклоняется на разный угол при преломлении. Простой пример - призма, разлагающая белый свет на спектр. Мы попробуем смоделировать такие преломления.
Для начала рассмотрим обычное монохроматическое преломление. В первую очередь обратим внимание на тот факт, что в природе не бывает поверхностей, полностью пропускающих свет - часть его всегда отражается. То есть нам требуется рассчитать отраженный и преломленный векторы для каждой вершины, на основе которых мы получим координаты текстуры. Для этого есть стандартные библиотечные функции refract и reflect. Коэффициент преломления возьмем постоянным и равным 0.1:
Cg Vertex Shader:
1
struct VertIn
2
{
3
float4 pos : POSITION;
4
float4 normal : NORMAL;
5
float2 tex0 : TEXCOORD0;
6
float4 color : COLOR;
7
};
8
9
struct VertOut
10
{
11
float4 pos : POSITION;
12
float4 reflectVec : TEXCOORD0;
13
float4 refractVec : TEXCOORD1;
14
float4 fresnelTerm : COLOR;
15
};
16
17
// fresnel approximation
18
fixed fast_fresnel(float3 I, float3 N, float3 fresnelValues)
У нас есть два варианта: использовать кубические карты окружения или обычные 2D-текстуры, снимаемые с экрана. В первом случае не нужно дополнительное преобразование по матрицам текстуры, цель которого - убрать перспективное преобразование. Я выбрал второй способ. Итак, в пиксельном шейдере нам нужно получить цвет отражения и преломления и объединить их.
Теперь добавим эффект аберрации лучей. Все, что для этого требуется - рассчитать три разных вектора преломления (для красного, зеленого и синего компонента света) с разными коэффициентами преломления.
Cg Vertex Shader:
1
struct VertIn
2
{
3
float4 pos : POSITION;
4
float4 normal : NORMAL;
5
float2 tex0 : TEXCOORD0;
6
float4 color : COLOR;
7
};
8
9
struct VertOut
10
{
11
float4 pos : POSITION;
12
float4 reflectVec : TEXCOORD0;
13
float4 refractVecR : TEXCOORD1;
14
float4 refractVecG : TEXCOORD2;
15
float4 refractVecB : TEXCOORD3;
16
float4 fresnelTerm : COLOR;
17
};
18
19
// fresnel approximation
20
fixed fast_fresnel(float3 I, float3 N, float3 fresnelValues)
В пиксельном шейдере нам нужно взять соответствующие цветовые компоненты по векторам преломления в экранной текстуре, и объединить их в один цвет преломления. А далее все так же - объединяем его с цветом отражения.
Получаем вот такой симпатичный эффект. Для карты отражения я использовал ту же текстуру, что и для карты преломления, но вы можете использовать свою, или кубическую карту (как уже говорилось выше). Можно также использовать карты нормалей для более детализированной геометрии, но это сильно нагрузит пиксельный шейдер, т.к. операции по рассчету преломлений и отражений придется делать в нем.
В примере нажмите пробел для включения и выключения аберрации. Само собой, требуется поддержка вторых шейдеров.
Вложение: chab.zip (45.1 кб)
Этот файл был скачан 2321 раз. XaeroX проверил это вложение на вирусы 10-12-2005 в 09:18
Само преломление рулит, правда я не понял прикола с цветовой абберацией.. Ну добавляется какая-то красная подсветка.. В роли игрока, мне было-бы пофигу
BUzer ты запусти пару мыльных пузырей и посморти Там идет разложение света на спектр при преломлении. Я конечно не ручаюсь, что мой вариант суперреалистичен, но что-то похожее имитирует.
Мне кажется, на радеонах мало что нормально пашет. У меня например нету теней в хлфх. И вообще у меня хлфх вылетает, когда подбираешь оружие или батарейку. Когда клиента заменяешь на клиента обычной халфы - всё работает
Понравилось, играюсь подставляя различные картинки.
Добавлено сегодня в 15:00:
Вот только если взять шар, то в центре хроматической абберации быть не должно, там свет никак не переломляется, а у тебя всё равномерено разложенно по цветам вне зависимости от улов переломленя.
Ku2zoff
>> Когда клиента заменяешь на клиента обычной халфы - всё работает
Странно , по теории если заменить клиентку мода на стандартную , то новшества врятли будут работать , если только они не на сервере
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!