Як зробити дзеркало чи інші світловідбиваючі поверхні?


16

Я просто задумався, як створити дзеркало в 3D-грі? Моя пропозиція полягає в тому, щоб / простежити промені, вдаривши по "дзеркальному" об'єкту, потім намалювати зображення другої камери на "дзеркальний" об'єкт, розташований у "точці" дзеркала оригінальної камери, використовуючи ударну сторону дзеркального об'єкта як дзеркальна площина.

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


1
Чи хотіли б ви мати ескіз / креслення "як я мав на увазі" цю річ?
daemonfire300

Ви можете спробувати опублікувати це на сайті stackoverflow.com, оскільки це не пов'язане безпосередньо з розвитком гри; можливо, там є більше графічних експертів, які можуть вам допомогти.
Ricket

Відповіді:


14

Якщо ви використовуєте OpenGL, в розділі 9: FAQ: Open Transformation описано, як саме це зробити. І ні, це не передбачає проміння, оскільки це зрозуміло дуже неефективний (але якісний) спосіб досягти цього.

9.170 Як зробити дзеркало?

Тут по суті йдеться про запитання FAQ, а приклад коду демонструє:

  • Налаштування матриці відображення перегляду. Робити це для дзеркал, орієнтованих на осі, пояснено у другому параграфі.
  • Намалюйте сцену
  • Відновіть матрицю подання та очистіть буфер глибини
  • Знову виведіть сцену; фактична геометрія дзеркала в цій сцені повинна бути напівпрозорою або повністю прозорою, щоб відобразитись до раніше наданої дзеркальної сцени.

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

Я думаю, якби ви використовували DirectX, процедура була б майже однаковою.


3
Якщо у вас більше пам’яті, ніж часу на рендерінг, - просто відобразити вашу геометрію світу через дзеркало у вашому 3D-редакторі, то ви можете змінити його так, як вам захочеться (примушуйте нижчі рівні мип тощо). Ми зробили це на PS1, де речі, що сиділи на блискучій підлозі, дублювались / перевертали під землею, а сама підлога виглядала напівпрозорою.
Даш-Том-Банг

Зауважте, що зразок коду відноситься до застарілої специфікації OpenGL. Проте концепція є універсальною і, ймовірно, може бути застосована аналогічно, використовуючи новітню специфікацію OpenGL .
patryk.beza
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.