Правильный термин "твердый". И ваша проблема нетривиальна, и нет простого способа решить ее на месте. Лучшая вещь для простого поддельного преломления - рендеринг кубической карты с началом координат в объектах, ограничивающих центр тома, и использование этой кубической карты с объектными нормалями, масштабированными в качестве координат текстуры. Если вы хотите, чтобы он выглядел более точно, вам нужно знать о взаимодействиях света и материи. Единственный совершенно точный способ воссоздать эффекты взаимодействия света с веществом - это трассировка лучей (если используются дифференциальные лучевые элементы, можно назвать это фотонным картированием).
Используя OpenGL, можно получить грубые приближения, если результаты будут отображаться в реальном времени.
Рендеринг полупрозрачных тел должен как-то напоминать оптические эффекты
- преломление
- отражение
- поглощение - когда свет проходит через твердое тело, он будет отфильтровываться
- флуоресценция - например, если солнечный свет или просто фиолетовый свет проходит через кусок уранового стекла , ультрафиолетовая часть вызовет зеленую флуоресценцию. Синяя часть света поглощается, но вы получаете зеленую часть, излучающую стекло.
- рассеяние - мелкие частицы в стекле, примеси, маленькие пузырьки воздуха и т. Д. Рассеивают свет. Это то, что делает туман.
В большинстве случаев достаточно имитировать преломление и поглощение. Стекло может быть обработано таким образом довольно эффективно. Существует 3 важных параметра для получения преломляющего, поглощающего твердого вещества:
- угол входа падающего луча (это неявно определяет луч внутри твердого тела)
- мышление материала
- угол выхода луча
Есть несколько способов получить их:
- Вы можете предварительно вычислять их, сохранять их как набор коэффициентов сферических гармоник, используемых в качестве дополнительного входа сэмплера в шейдере.
- Вы можете использовать глубинный пилинг, чтобы разрезать рассматриваемый объект на слои поверхностей. Нечетные пронумерованные слои - это вход, четные - выход. Вы идете от ближнего к дальнему. Удар вблизи поверхности преломляет луч, вы следуете за ним до тех пор, пока он не достигнет поверхности выхода, и снова преломите его там. Длина луча используется в качестве параметра в, например, уравнение поглощения закона Бера-Ламберта.
Итак, как вы реализуете это в OpenGL. Боюсь, что ответ на Stackoverflow не сможет покрыть его, если он не превратился в полноценный документ. Поэтому я отсылаю вас к главе 19 GeForce GPU 2 , которая охватывает основы http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html