Алгоритм плоского затенения для 3D-материала - PullRequest
1 голос
/ 14 августа 2011

В настоящее время я ищу информацию о том, как получить окончательное значение плоского цвета данного лица в освещенной трехмерной сцене. У меня есть класс Material, который содержит следующие 4 цвета:

окружающий, зеркальный, рассеянный и излучающий

В классе My Color есть методы для простых эффектов наложения, такие как сложение, умножение и т. Д.

Из списка источников света, положения камеры, материала, нормального положения лица и положения лица. Я хотел бы рассчитать окончательный цвет грани, которая будет заполнена, с помощью программного конвейера рендеринга, используя стандартную модель материала 4 цвета.

Ответы [ 2 ]

3 голосов
/ 14 августа 2011

Полагаю, вам нужна стандартная Фонг или Блинн-Фонг модель освещения, которую использует 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;

Конечно, для каждого источника света необходимо вычислять окружающее, рассеянное и зеркальное выражение.

Для более сложных источников света, кроме простых точечных источников света, без ослабления на расстоянииВы должны учитывать другие вещи, но эта простая модель должна помочь вам начать.

1 голос
/ 14 августа 2011

Цвета просто складываются вместе:

ambient + diffuse + emissive + specular

Ambient - это базовый цвет.Диффузный - это цвет материала, умноженный на интенсивность освещения.Эмиссив просто добавлен, чтобы создать иллюзию некоторого глобального освещения.Последний - это зеркальный цвет, который умножается на результат расчета зеркального освещения.

Таким образом, он становится:

ambientcolor + diffusecolor * diffuselighting + emissivecolor + specularcolor * specularlighting

По моему опыту, это не всегда желаемая модель освещения.Задание разных оттенков для этих цветов приводит к неестественному поведению освещения, но именно так работают модели конвейера с фиксированными функциями OpenGl и DirectX.

...