Jeśli wiesz, co to jest rzutowanie promieniami, wszystko, co musisz naprawdę zrobić, to na stałe go zakodować. Nie jest to zbyt skomplikowane, o ile masz współrzędne dla każdego wierzchołka.
Najpierw utwórz obiekt emitujący światło. Umieść swoje światło na współrzędnych 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
Nie gwarantuje się, że zadziała w przypadku wielokąta wklęsłego, ale powinno działać dobrze w przypadku dowolnych wielokątów wypukłych.
Działa to, jeśli obiekty okluzji (ściany, postać, latający purpurowy zjadacz ludzi) zostaną namalowane na ekranie po zastosowaniu oświetlenia. W przeciwnym razie połowa ściany będzie wydawać się znacznie jaśniejsza niż druga połowa. Jeśli światło punktowe jest w równej odległości od dwóch par wierzchołków tej samej ściany (dokładnie o połowę wysokości wysokości ściany), zastosuj trójkąt do dwóch najbliższych wierzchołków, a nie dwóch dalej.
Powinienem również wspomnieć, że ta metoda wymaga dynamicznie tworzonego punktu wierzchołka, w którym krawędź promienia światła styka się z powierzchnią obiektu zamykającego.Tworzy to co najmniej 3 wierzchołki dla każdego obiektu zasłaniającego i pozwoli ścianom, które wystają poza promień światła (lub poza ekranem), również blokować każde światło.
Więcej informacji o wielokątach wklęsłych i wypukłych