Якщо ви знаєте, що таке кастинг, то все, що вам потрібно зробити, це дійсно жорсткий код. Це не надто складно, якщо у вас є координати для кожної вершини.
Спочатку створіть світлопроменевий об’єкт. Розмістіть світло за координатами x, y.
#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
lightOccludingVertices[i] = vertex;
i++;
}
//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest
//vertex on the x-axis, and the furthest vertex on the y-axis
Це не гарантовано для роботи увігнутого багатокутника, але він повинен спрацьовувати добре для будь-яких опуклих багатокутників.
Це спрацює, якщо ваші оклюзійні предмети (стіни, персонаж, літаючі фіолетові їдять люди) будуть намальовані на екран після застосування освітлення. Інакше половина стіни виявиться значно яскравішою, ніж інша половина. Якщо ваш точковий світло рівновіддалений від двох пар вершин однієї стіни (рівно наполовину більше, ніж висота вашої стіни), застосуйте трикутник до двох найближчих вершин, а не двох далі.
Я також повинен зазначити, що для цього методу потрібна динамічно створена вершинна точка, де край радіуса світла відповідає поверхні оклюзійного об'єкта. Це створює мінімум 3 вершини для будь-якого оклюзійного об'єкта і дозволить стінам, що простягаються повз радіус світла (або поза екраном), також блокувати будь-яке світло.
Детальніше про увігнуті та опуклі багатокутники