2016-04-19 2 views
-1

Я хочу имитировать тени, создаваемые сложными и составными прозрачными объектами. Эти тени должны быть математически правильными для конкретного источника света (по крайней мере для точечного освещения). Я думаю, что это верно для любой графической библиотеки, не так ли? Чем больше не должно быть рефракции.Как имитировать математически правильные тени прозрачных объектов?

This image is not what I actually want to get of course
Это изображение не то, что я на самом деле хочу, чтобы получить, конечно.

Может ли OpenGL это сделать? Если он не может, то что я должен использовать вместо этого?

UPD. Так что мне нужен трассировщик пути. Есть ли какие-то способы, которые я мог бы использовать программно: дать ему файл 3d-сцены с объектами и получить результат трассировки?

+2

Определите «математически правильный». –

+0

О, хороший вопрос, спасибо.Любая прямая от источника, который пересекает объект, должна заканчиваться тенью на некоторой плоскости. Тон тени зависит от толщины и прозрачности материалов объектов, которые пересекались этой линией. Если есть какие-то полости, их нужно учитывать. –

+0

Короткий ответ: Нет, OpenGL - это растеризатор, и вы ищете лучей. Более длинный ответ может содержать некоторые предположения о том, как вы могли бы сделать это в OpenGL, но поскольку вы, похоже, мало что знаете о OpenGL или компьютерной графике (без обид), я не думаю, что это вам поможет. Мой совет: Проверьте Блендер. –

ответ

2

Это тень должна быть математически правильно

Там нет такого понятия, как математически правильного или неправильного освещение. Что Вы имеете в виду: физически исправно.

Изображения, которые вы хотите создать, опираются на распространение света. Единственный способ правильно имитировать распространение света - это снимать виртуальные фотоны в сцену и следовать их пути. Это называется трассировка пути.

Может ли OpenGL это сделать?

OpenGL просто рисует точки, линии и треугольники ... по одному, без какой-либо концепции сцены или моделей.

Старый, фиксированный функциональный трубопровод OpenGL имеет простую модель освещения Blinn, встроенную, но это только что подсчитало «световую» величину на вершину, основанную на ориентации поверхности (нормаль) и положении относительно источника света.

Современный OpenGL даже не делает этого. Вместо этого он полагается на программиста, чтобы предоставлять программы, которые выполняются для каждой вершины, чтобы решить, где находится изображение, и для каждого фрагмента (примерно пиксель), нарисованного, чтобы определить, какой цвет ему дать.

В этих программах, называемых шейдерами, вы можете сделать что угодно. Поэтому, если вы хотите реализовать трассировщик путей с использованием шейдеров OpenGL, вы, безусловно, можете это сделать. Но этот трассировщик пути не будет взаимодействовать с точками, линиями и треугольниками, которые вы рисуете. Вместо этого они будут служить только для определения границ, в которых шейдеры выполняют свои вычисления.

Если это невозможно, то что я должен использовать вместо этого?

Это не вопрос, если это возможно, но как его легко реализовать. В вашем случае OpenGL - это, конечно, не правильная среда программирования, потому что вы начинаете с нуля. Вместо этого вы должны использовать один из существующих трассировщиков путей. Есть и некоторые, которые ускоряют GPU.

+0

Спасибо за подробное объяснение! Поэтому мне нужна трассировка пути для сцены. Не могли бы вы предложить некоторые из них, которые можно использовать программно (UPD в сообщении)? –

+0

Или я должен сделать это с нуля? .. –

+0

@AlexanderTrofimchouk: Если вы google «трассировщик пути с открытым исходным кодом», вы получите множество результатов. Лично я очень люблю LuxRender. Как и практически все автономные визуализаторы LuxRender будут глотать файл описания сцены и испускать изображение. Совершенно законно производить программный файл описания сцены, создавать процесс рендеринга и считывать результат. На самом деле из соображений прочности и модульности разделение задач на отдельные процессы очень желательно. Многие вещи, предлагаемые библиотеками, часто лучше вписываются в отдельные исполняемые файлы. – datenwolf

Смежные вопросы