Это тень должна быть математически правильно
Там нет такого понятия, как математически правильного или неправильного освещение. Что Вы имеете в виду: физически исправно.
Изображения, которые вы хотите создать, опираются на распространение света. Единственный способ правильно имитировать распространение света - это снимать виртуальные фотоны в сцену и следовать их пути. Это называется трассировка пути.
Может ли OpenGL это сделать?
OpenGL просто рисует точки, линии и треугольники ... по одному, без какой-либо концепции сцены или моделей.
Старый, фиксированный функциональный трубопровод OpenGL имеет простую модель освещения Blinn, встроенную, но это только что подсчитало «световую» величину на вершину, основанную на ориентации поверхности (нормаль) и положении относительно источника света.
Современный OpenGL даже не делает этого. Вместо этого он полагается на программиста, чтобы предоставлять программы, которые выполняются для каждой вершины, чтобы решить, где находится изображение, и для каждого фрагмента (примерно пиксель), нарисованного, чтобы определить, какой цвет ему дать.
В этих программах, называемых шейдерами, вы можете сделать что угодно. Поэтому, если вы хотите реализовать трассировщик путей с использованием шейдеров OpenGL, вы, безусловно, можете это сделать. Но этот трассировщик пути не будет взаимодействовать с точками, линиями и треугольниками, которые вы рисуете. Вместо этого они будут служить только для определения границ, в которых шейдеры выполняют свои вычисления.
Если это невозможно, то что я должен использовать вместо этого?
Это не вопрос, если это возможно, но как его легко реализовать. В вашем случае OpenGL - это, конечно, не правильная среда программирования, потому что вы начинаете с нуля. Вместо этого вы должны использовать один из существующих трассировщиков путей. Есть и некоторые, которые ускоряют GPU.
Определите «математически правильный». –
О, хороший вопрос, спасибо.Любая прямая от источника, который пересекает объект, должна заканчиваться тенью на некоторой плоскости. Тон тени зависит от толщины и прозрачности материалов объектов, которые пересекались этой линией. Если есть какие-то полости, их нужно учитывать. –
Короткий ответ: Нет, OpenGL - это растеризатор, и вы ищете лучей. Более длинный ответ может содержать некоторые предположения о том, как вы могли бы сделать это в OpenGL, но поскольку вы, похоже, мало что знаете о OpenGL или компьютерной графике (без обид), я не думаю, что это вам поможет. Мой совет: Проверьте Блендер. –