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

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

Вернуться   www.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 21.02.2015, 12:31   #1
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Примитивное освещение

Хочу сделать примитивное освещение, ну типо как на картинке, но думаю это необходимо выполнить на шейдере, так как тяжко перебрать на CPU столько пикселей, но я вообще нуб в GLSL (надо на нём).
Хочу сделать так:


Наведите на путь истинный.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 21.02.2015, 13:43   #2
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,217
Написано 436 полезных сообщений
(для 784 пользователей)
Ответ: Примитивное освещение

перевод из одной системы координат в другую делать не матрицей (ей, наверно, такое невозможно), а тупо alpha = atan2(dx, dy) и r = sqrt(dx^2+dy^2), а обратно - dx = r * cos(alpha), dy = r * sin(alpha).
И каждую исходную линию при рисовании её, как тени, рисовать как четырёхугольник, у которого нижняя сторона параллельна верхней и сильно смещена вниз.
Забавный способ.

А ещё можно не плющить пространство, а просто на CPU рассчитать, как стоят чёрные четырёхугольники - тени и тупо их нарисовать до того, как рисуются буквы.
так даже проще.
Т.е., для каждого отрезка (x1, y1) (x2, y2) сначала нарисовать чёрный четырёхугольник (как два треугольника) с вершинами (x1, y1) (x2, y2) (x1*10.0, y1*10.0) (x2*10.0, y2*10.0), а потом как обычно.

P.S. Можно реализовать с помощью матриц - сделать буквы объёмными моделями с некоторой высотой и чёрными сторонами, брать перспективную проекцию видом сверху и инвертировать z-sorting.
P.P.S. Последний способ мне кажется самым удобным
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW

Последний раз редактировалось Igor, 21.02.2015 в 15:35.
(Offline)
 
Ответить с цитированием
Старый 21.02.2015, 15:01   #3
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 977
Написано 388 полезных сообщений
(для 630 пользователей)
Ответ: Примитивное освещение

По моему в данном случае всё проще и можно расчёты выполнить не выходя за рамки пикселей и 2д.
Берётся много лучей и бросается от источника света во все стороны, так чтобы их плотность была оптимальной для данного разрешения изображения (этот шаг делаем в уме). Теперь берём и производим вдоль каждого луча выборку из текстуры (данного ч/б изображения) шагами с определённой длинной (опять же обусловленной разрешением изображения). Затем мы (этот шаг тоже можно представить в уме) разворачиваем все лучи параллельно друг другу. Теперь перебираем пиксели каждого луча от начала до конца, изображение у нас ч/б, где черный пиксель это препятствие, как только попадется первый черный пиксель -- все остальные можно смело закрашивать чёрным -- это будет тень. Затем представим что все лучи обратно разворачиваются на своё место. Новые полученные цвета записываем обратно по своим координатам и смешиваем с цветным изображением. Понятно что лучи реально разворачивать не надо -- пиксели лежать в памяти линейно в виде массивов, это только чтобы образно лучше представлять что происходит.
__________________
Config1: Windows 10 x64 / Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1920x1080; Intel Core i7 930 @ 2.80GHz; DDR3 9GB Triple; AMD Radeon R9 290 4GB; SSD Ignition 2 120GB; HDD Seagate 1TB.
Config2: Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1366x768; Intel Pentium Dual-Core T4400 @ 2.20GHz; DDR2 2GB; NVIDIA GeForce G105M; HDD WD 250GB.
(Offline)
 
Ответить с цитированием
Старый 22.02.2015, 05:31   #4
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Примитивное освещение

extern vec2 pointPos;

vec4 effectvec4 colorImage imgvec2 tcvec2 sc )
{
     
vec2 pos pointPos/love_ScreenSize.xy;
     
vec2 dp pos-tc;
     
float aphi dp.y/dp.x;
     
float dx dp.x/30;
     
float ret 0;

     for (
int i 030; ++i)
     {
         
float x dx*i;
         
vec4 c Texel(img,pos-vec2(x,x*aphi));
         if(
c.a!=0){
             
ret 1.0;
             break;
         }

     }
    return 
vec4(0,0,0,1)*ret;


Юзаю тот шейдер, получаю такую картинку, чем меньше интераций - тем больше квадратность.
Алгоритм:
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 22.02.2015, 08:41   #5
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,217
Написано 436 полезных сообщений
(для 784 пользователей)
Ответ: Примитивное освещение

Как-то убого выглядит, не?
Моим способом края теней получатся ровными, а не ступеньками, и производительность должна быть повыше. 100 чтений их текстуры для каждого пикселя - очень дофига
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Старый 22.02.2015, 09:00   #6
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Примитивное освещение

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

Я не сразу допер что проще можно сделать, а от спрайтов тень есть
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 22.02.2015, 15:11   #7
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 977
Написано 388 полезных сообщений
(для 630 пользователей)
Ответ: Примитивное освещение

Выглядит примерно так как я предложил. Да будет недостаток точности по краям и избыток ближе к источнику -- нужно разрешение выше ставить, либо делать избирательную точность, но это усложнения алгоритма.
Насчёт того что быстрее геометрия или работа с пикселями. Зависит от характера изображения: если на нем простые геометрические фигуры то будет меньше вершин, а значит и расчётов геометрии меньше. Если изображение очень сложное с большим количеством плавных линий, то лучше раборать сразу в пикселями. В целом подход с геометрией сложнее в расчётах, но даст профит если геометрия простая.
__________________
Config1: Windows 10 x64 / Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1920x1080; Intel Core i7 930 @ 2.80GHz; DDR3 9GB Triple; AMD Radeon R9 290 4GB; SSD Ignition 2 120GB; HDD Seagate 1TB.
Config2: Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1366x768; Intel Pentium Dual-Core T4400 @ 2.20GHz; DDR2 2GB; NVIDIA GeForce G105M; HDD WD 250GB.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


Часовой пояс GMT +1, время: 22:49.


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