Как мне сделать зеркало или другие отражающие поверхности?

16

Мне просто интересно, как создать зеркало в 3D игре? Мое предложение заключается в том, чтобы / было отслеживать лучи, ударяя объект «зеркало», а затем рисуя изображение второго кулачка на объект «зеркало», который расположен в зеркальной «точке» оригинальной камеры, используя сторону удара объекта зеркала в качестве зеркальная плоскость.

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

daemonfire300
источник
1
Хотели бы вы иметь эскиз / рисунок "как я имел в виду" эту вещь?
daemonfire300
Вы можете попробовать опубликовать это на stackoverflow.com, поскольку это не связано непосредственно с разработкой игры; возможно, есть другие эксперты в области графики, которые могли бы вам помочь.
Рикет

Ответы:

14

Если вы используете OpenGL, в разделе 9 часто задаваемых вопросов по OpenGL: Преобразования описывается, как именно это сделать. И нет, это не связано с трассировкой лучей, поскольку это понятно, что это очень неэффективный (но качественный) способ сделать это.

9.170 Как мне сделать зеркало?

Вот, по сути, то, что написано в FAQ, и пример кода демонстрирует:

  • Установите отраженную матрицу представления. Это делается для зеркал с выравниванием по оси, что объясняется во втором абзаце.
  • Нарисуй сцену
  • Восстановите матрицу вида и очистите буфер глубины
  • Рендеринг сцены снова; Фактическая геометрия зеркала в этой сцене должна быть полупрозрачной или полностью прозрачной, чтобы показать ранее отрисованную зеркальную сцену.

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

Я полагаю, если вы используете DirectX, процедура будет такой же.

Ricket
источник
3
Альтернатива, если у вас больше памяти, чем времени рендеринга, это просто отразить геометрию вашего мира через зеркало в вашем 3D-редакторе, затем вы можете изменить его так, чтобы он выглядел так, как вам хочется (применить более низкие уровни MIP и т. Д.). Мы сделали это на PS1, где вещи, сидящие на блестящем полу, были продублированы / перевернуты под землей, а сам пол стал полупрозрачным.
даш-том-бэнг
Обратите внимание, что пример кода относится к устаревшей спецификации OpenGL. Тем не менее, концепция универсальна и, вероятно, может применяться аналогичным образом с использованием новейшей спецификации OpenGL .
patryk.beza