Визуализация * наполненного * полупрозрачного куба в OpenGL - PullRequest
1 голос
/ 03 сентября 2011

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

Ответы [ 4 ]

7 голосов
/ 03 сентября 2011

Правильный термин "твердый". И ваша проблема нетривиальна, и нет простого способа решить ее на месте. Лучшая вещь для простого поддельного преломления - рендеринг кубической карты с началом координат в объектах, ограничивающих центр тома, и использование этой кубической карты с объектными нормалями, масштабированными в качестве координат текстуры. Если вы хотите, чтобы он выглядел более точно, вам нужно знать о взаимодействиях света и материи. Единственный совершенно точный способ воссоздать эффекты взаимодействия света с веществом - это трассировка лучей (если используются дифференциальные лучевые элементы, можно назвать это фотонным картированием).

Используя OpenGL, можно получить грубые приближения, если результаты будут отображаться в реальном времени.

Рендеринг полупрозрачных тел должен как-то напоминать оптические эффекты

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

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

  • угол входа падающего луча (это неявно определяет луч внутри твердого тела)
  • мышление материала
  • угол выхода луча

Есть несколько способов получить их:

  • Вы можете предварительно вычислять их, сохранять их как набор коэффициентов сферических гармоник, используемых в качестве дополнительного входа сэмплера в шейдере.
  • Вы можете использовать глубинный пилинг, чтобы разрезать рассматриваемый объект на слои поверхностей. Нечетные пронумерованные слои - это вход, четные - выход. Вы идете от ближнего к дальнему. Удар вблизи поверхности преломляет луч, вы следуете за ним до тех пор, пока он не достигнет поверхности выхода, и снова преломите его там. Длина луча используется в качестве параметра в, например, уравнение поглощения закона Бера-Ламберта.

Итак, как вы реализуете это в OpenGL. Боюсь, что ответ на Stackoverflow не сможет покрыть его, если он не превратился в полноценный документ. Поэтому я отсылаю вас к главе 19 GeForce GPU 2 , которая охватывает основы http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html

3 голосов
/ 03 сентября 2011

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

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

0 голосов
/ 04 сентября 2011

Вы можете попробовать нарисовать много прозрачных квадратов между верхней / нижней, левой / правой и передней / задней гранями.Таким образом, объект, скрытый большим количеством куба, окажется за более прозрачными слоями и, следовательно, будет менее видимым.

0 голосов
/ 04 сентября 2011

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

...