Lens flare postprocess filter
ninth Дата: Вторник, 11.12.2012, 16:17 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
Эффект, бликов на линзах, реализованный с помощью шейдерных пост-процесс фильтров. Основным плюсом такого подхода является то, что бликовать будут любые яркие объекты - любое количество без особой настройки сцены. Сделано по этой статье . Картинку с грязью на линзу не накладывал, но при желании можно реализовать. Готовый пример с ресурсами . Скрины:
ninth Дата: Вторник, 11.12.2012, 21:01 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
Для тех, у кого возникла проблема Quote
:gobj(error): Cg program too complex for driver: invert_threshold_r_blur.sha. Try choosing a different profile.
на атишных карточках - попробуйте этот вариант шейдера invert_threshold_r_blur.sha Похоже проблема вызвана слишком большим количеством входных параметров, так что они здесь заданы жёстко, оставлен только параметр порога яркости.
ninth Дата: Вторник, 11.12.2012, 23:19 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
Обновил архив, Параметры радиального размытия жёстко включены в код шейдера. Внешне передаются только порог яркости и яркость бликов в одном 4-хкомпонентном векторе.
ninth Дата: Среда, 12.12.2012, 14:07 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
Фикс для lens_flare.sha
Code
//Cg void vshader( float4 vtx_position : POSITION, float2 vtx_texcoord0 : TEXCOORD0, out float4 l_position : POSITION, out float2 l_texcoord0 : TEXCOORD0, out float2 l_texcoord1 : TEXCOORD1, uniform float4 texpad_tex1, uniform float4x4 mat_modelproj) { l_position=mul(mat_modelproj, vtx_position); l_texcoord0 = vtx_position.xz * texpad_tex1.xy + texpad_tex1.xy; //l_texcoord0 = vtx_position.xz + float2(0.4, 0.3);// * texpad_tex.xy + texpad_tex.xy; l_texcoord1 = 1.0 - (vtx_position.xz * texpad_tex1.xy - texpad_tex1.xy); } void fshader(float2 l_texcoord0 : TEXCOORD0, float2 l_texcoord1 : TEXCOORD1, out float4 o_color : COLOR, uniform float4 texpad_tex1, uniform float3 k_lf_settings, uniform sampler2D k_tex1 : TEXUNIT0, uniform sampler2D k_tex2 : TEXUNIT1, uniform sampler2D k_tex3 : TEXUNIT2) { //int NSAMPLES = 5; //float FLARE_HALO_WIDTH = 0.3; //float FLARE_DISPERSAL = 0.35; float3 CHROMA_DISTORT = float3(0.005, -0.005, 0.0); int NSAMPLES = int(k_lf_settings.x); float FLARE_HALO_WIDTH = k_lf_settings.y; float FLARE_DISPERSAL = k_lf_settings.z; float4 c = tex2D(k_tex1, l_texcoord0); float2 sample_vector = (texpad_tex1.xy - l_texcoord0) * FLARE_DISPERSAL; float2 halo_vector = normalize(sample_vector) * FLARE_HALO_WIDTH; float3 tmp = float3(0.0); float3 result = 0.0; result.x = tex2D(k_tex3, l_texcoord0 + halo_vector + halo_vector * CHROMA_DISTORT.x).x; result.y = tex2D(k_tex3, l_texcoord0 + halo_vector + halo_vector * CHROMA_DISTORT.y).y; result.z = tex2D(k_tex3, l_texcoord0 + halo_vector + halo_vector * CHROMA_DISTORT.z).z; for (int i = 0; i < NSAMPLES; ++i) { float2 offset = sample_vector * float(i); tmp.x = tex2D(k_tex3, l_texcoord0 + offset + offset * CHROMA_DISTORT.x).x; tmp.y = tex2D(k_tex3, l_texcoord0 + offset + offset * CHROMA_DISTORT.y).y; tmp.z = tex2D(k_tex3, l_texcoord0 + offset + offset * CHROMA_DISTORT.z).z; result += tmp; } result /= float(NSAMPLES); o_color = (float4(result.x + c.x, result.y + c.y, result.z + c.z, 1.0));// + //tex2D(k_tex3, l_texcoord0)); }
ninth Дата: Среда, 12.12.2012, 17:00 | Сообщение # 5
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
В общем из-за нелюбви АТИшных карт к входным переменным пришлось большую часть параметров зашить внутрь шейдеров. В принципе думаю ничего страшного - можно и там их поправить как захочется. Архив обновил.
k0t Дата: Четверг, 13.12.2012, 09:14 | Сообщение # 6
Подполковник
Группа: Пользователи
Сообщений: 104
Награды:
0
Репутация:
4
Статус: Offline
Последняя версия на атишной мобильной карте 5000 серии работает отлично. Правда, из-за widescreen линза блика получается овальная )
ninth Дата: Четверг, 13.12.2012, 09:23 | Сообщение # 7
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
А ты посмотрись, у тебя случаем не искажена вся картинка? Потому как формула радиального блика от пропорций никак не зависит, и если она исказилась, значит и всё остальное тоже должно было подвергнуться искажению.
k0t Дата: Четверг, 13.12.2012, 13:48 | Сообщение # 8
Подполковник
Группа: Пользователи
Сообщений: 104
Награды:
0
Репутация:
4
Статус: Offline
не, вся картинка ок, никаких искажений.
ninth Дата: Четверг, 13.12.2012, 14:16 | Сообщение # 9
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
Блин. Я даже х.з. Можешь скрин запостить? Может атишные карточки ещё как-то по-особому нормализацию (О_о) вектора выполняют?
k0t Дата: Четверг, 13.12.2012, 15:09 | Сообщение # 10
Подполковник
Группа: Пользователи
Сообщений: 104
Награды:
0
Репутация:
4
Статус: Offline
Смотри)
ninth Дата: Четверг, 13.12.2012, 16:36 | Сообщение # 11
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
Как такое может быть?! >< Надо будет на досуге с разными разрешениями поиграть, может что обнаружу
serg-kkz Дата: Суббота, 15.12.2012, 19:36 | Сообщение # 12
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды:
3
Репутация:
18
Статус: Offline
Quote (ninth )
Фикс для lens_flare.sha
До него было все в розовом, после вот.
ООП -
ninth Дата: Воскресенье, 16.12.2012, 09:40 | Сообщение # 13
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
Посмотри, плиз, на что ругается в консоли и скажи какая у тебя видеокарточка и свежие ли дрова?
serg-kkz Дата: Воскресенье, 16.12.2012, 13:06 | Сообщение # 14
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды:
3
Репутация:
18
Статус: Offline
Скачал заново архив, и стало все нормально. AMD RADEON HD 7470M (ноутбук) Версия драйвера: 8.901.0.0 Quote (console )
:gobj(error): Cg program too complex for driver: invert_threshold_r_blur.sha. Try choosing adifferent profile. :gobj(error): Cg program too complex for driver: lens_flare.sha. Try choosing adifferent profile.
ООП -
Сообщение отредактировал serg-kkz - Воскресенье, 16.12.2012, 13:10
ninth Дата: Воскресенье, 16.12.2012, 16:48 | Сообщение # 15
Admin
Группа: Администраторы
Сообщений: 1582
Награды:
5
Репутация:
46
Статус: Offline
Ну да, я думал ты последнюю версию использовал, так с ранними проблемы на АТИшках были