Если коротко, то на шейдерах.
Знаешь что такое источник света? Если да, то берешь из точки источника и направляешь в нужную сторону вектор. Далее смотришь пересекает он какие-то объекты или нет. Если пересекает, то смотришь в какой точке и под каким углом он пересекает первый объект, от этой точки отправляешь следующий вектор, и повторяешь процедуру сколько хочешь раз. Количество векторов отправляешь сколько хочешь. Так как вектор это луч света, то он имеет свой цвет, при встречи с объектом, его цвет смешивается с цветом объекта, так объект красится и отображается. Следующий луч уже имеет получившийся цвет и отражается далее.
glslsandbox.com/e#52242.4
https://www.youtube.com/watch?v=D-HroAIUePM