Полагаю, вам нужна стандартная Фонг или Блинн-Фонг модель освещения, которую использует GL с фиксированной функцией.
Эмиссионный термин - этоцвет, который материал излучает сам (например, при моделировании света).Так что это просто добавляет к окончательному цвету.
color = emissive;
Окружающий термин имитирует вычисление непрямого освещения из-за бесконечно отраженного света, поэтому он не зависит от положения света и находится примерно везде.Таким образом, окружение материала просто умножается на цвет света и добавляет к окончательному цвету.
color += ambient * lightColor;
Диффузный термин имитирует стандартный ламбертовский отражатель, который отражает свет одинаково во всех направлениях.Это зависит от угла между направлением света и нормалью поверхности, причем меньшие углы дают больше света.
lightDir = normalize(lightPos-facePos);
color += dot(lightDir, normal) * diffuse * lightColor;
Термин «зеркальное отражение», наконец, имитирует зеркальные поверхности, которые отражают больше света в единственном направлении (идеальное направление отражения).Таким образом, это зависит от направления, в котором вы смотрите на грань. Кроме того, отражательная способность зависит от другого параметра, который описывает шероховатость поверхности (или фактически ее блеск, который также используется именем GL, с более высокими значениями, делающими более резкие блики и, таким образом,более «блестящий»).
viewDir = normalize(cameraPos-facePos);
halfVec = normalize(lightDir+viewDir);
color += pow(dot(normal, halfVec), shininess) * specular * lightColor;
Конечно, для каждого источника света необходимо вычислять окружающее, рассеянное и зеркальное выражение.
Для более сложных источников света, кроме простых точечных источников света, без ослабления на расстоянииВы должны учитывать другие вещи, но эта простая модель должна помочь вам начать.