forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Примитивное освещение (http://forum.boolean.name/showthread.php?t=19704)

RegIon 21.02.2015 15:31

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


Наведите на путь истинный.

Igor 21.02.2015 16:43

Ответ: Примитивное освещение
 
перевод из одной системы координат в другую делать не матрицей (ей, наверно, такое невозможно), а тупо 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. Последний способ мне кажется самым удобным

Samodelkin 21.02.2015 18:01

Ответ: Примитивное освещение
 
По моему в данном случае всё проще и можно расчёты выполнить не выходя за рамки пикселей и 2д.
Берётся много лучей и бросается от источника света во все стороны, так чтобы их плотность была оптимальной для данного разрешения изображения (этот шаг делаем в уме). Теперь берём и производим вдоль каждого луча выборку из текстуры (данного ч/б изображения) шагами с определённой длинной (опять же обусловленной разрешением изображения). Затем мы (этот шаг тоже можно представить в уме) разворачиваем все лучи параллельно друг другу. Теперь перебираем пиксели каждого луча от начала до конца, изображение у нас ч/б, где черный пиксель это препятствие, как только попадется первый черный пиксель -- все остальные можно смело закрашивать чёрным -- это будет тень. Затем представим что все лучи обратно разворачиваются на своё место. Новые полученные цвета записываем обратно по своим координатам и смешиваем с цветным изображением. Понятно что лучи реально разворачивать не надо -- пиксели лежать в памяти линейно в виде массивов, это только чтобы образно лучше представлять что происходит.

RegIon 22.02.2015 08:31

Ответ: Примитивное освещение
 
PHP код:

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;



Юзаю тот шейдер, получаю такую картинку, чем меньше интераций - тем больше квадратность.
Алгоритм:

Igor 22.02.2015 11:41

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

RegIon 22.02.2015 12:00

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

Я не сразу допер что проще можно сделать, а от спрайтов тень есть:rolleyes:

Samodelkin 22.02.2015 18:11

Ответ: Примитивное освещение
 
Выглядит примерно так как я предложил. Да будет недостаток точности по краям и избыток ближе к источнику -- нужно разрешение выше ставить, либо делать избирательную точность, но это усложнения алгоритма.
Насчёт того что быстрее геометрия или работа с пикселями. Зависит от характера изображения: если на нем простые геометрические фигуры то будет меньше вершин, а значит и расчётов геометрии меньше. Если изображение очень сложное с большим количеством плавных линий, то лучше раборать сразу в пикселями. В целом подход с геометрией сложнее в расчётах, но даст профит если геометрия простая.


Часовой пояс GMT +4, время: 05:32.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot