Вы когда-нибудь задумывались, как ваш мозг отреагирует, если вы искривляете пространство вокруг себя в VR? Или изменить поле зрения и вызвать головокружение? Хорошо, я так и сделал, поэтому я начал писать серию шейдеров, которые деформировали пространство вокруг меня, используя матрицы, и в итоге получился эффект, похожий на Inception.

Я Ша, программист графики в Realities.io, и мне нравится возиться с шейдерами.

Я собираюсь кратко рассказать о том, как достигаются эти эффекты, и о своих мыслях о процессе. Реализация действительно проста. Вот шейдеры, которые я использовал для этих эффектов. Вы можете применить эту деформацию к любой сетке, НО для получения аналогичного результата она должна быть достаточно высокополигональной, как и сетки, которые я использовал, или быть мозаичной. Все эффекты были выполнены в Unity в реальном времени. Используемая сетка была тестовой сеткой realities.io.

Я хотел изменить поле зрения в VR и посмотреть, что это такое. Unity блокирует FOV, если у вас подключена гарнитура. Чувствуя себя сообразительным, я решил скорректировать расчет матрицы проекции в вершинном шейдере геометрии.

Если вы не знаете, что такое вершинный шейдер и как работают матрицы проекции, и вас интересует, я настоятельно рекомендую прочитать эту тему, например, это видео дает простое объяснение основ.

Для целей этой публикации достаточно знать, что для показа 2D-изображения 3D-сцены нам сначала нужно спроецировать 3D-геометрию на 2D-поверхность плоскости нашей камеры. Это достигается путем умножения вершин трехмерной геометрии на матрицу проекции, которая учитывает такие вещи, как ориентация камеры, ее положение, а также поле зрения. А Vertex Shader - это программа, отвечающая за инициирование этих вычислений.

Необходимо рассчитать три шага.

  1. Сначала необходимо преобразовать положение вершины из пространства объектов в мировое пространство, этот расчет варьируется от объекта к объекту.
  2. Затем позиции мирового пространства нужно переместить в область просмотра.
  3. И наконец, чтобы вырезать пространство. Шаги два и три меняются от камеры к камере. Unity объединяет все за один шаг, создавая одну матрицу для каждого объекта, которая содержит все эти преобразования, матрицу MVP.

Для моих целей мне нужно было снова разделить эти вычисления на три разных этапа. В основном потому, что я хочу изменить промежуточный вектор, полученный в результате этих вычислений. Одна простая вещь, которую стоит попробовать, - это изменить компонент w вектора в пространстве клипа (после вычисления MVP). Компонент w также известен как разделение перспективы, улучшение этого компонента приведет к некоторым забавным вещам в VR. Вот результат того эксперимента. Я меняю w в зависимости от положения вершин в мире.

Другой, используя компонент w и изменяя компонент z в пространстве просмотра, я получаю эффект головокружения в VR.

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

В приведенных выше примерах я изменяю компонент y, x пространства просмотра в зависимости от положения вершин в мире.

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

Спасибо за чтение, если у вас есть какие-либо вопросы, или в статье есть неверная информация, пожалуйста, свяжитесь со мной. Шейдеры доступны здесь. Если вам нужна сетка для экспериментов, вы можете скачать одну из многих сеток, которые есть в моем колледже Азад на Sketch fab. Если вы делаете с ним что-то крутое, отметьте нас и дайте нам знать, нам нравятся крутые вещи.

Шахриар Шахраби - графический программист Realities.io

Следуйте за ним в Twitter, чтобы быть в курсе всех новостей о шейдерах и фотограмметрии.

Загрузите БЕСПЛАТНОЕ приложение Realities в Steam

Изучите результаты нашего рабочего процесса фотограмметрии в красивой и детализированной среде со всего мира в виртуальной реальности.

Скачать из Steam для Oculus Rift / HTC Vive.

Следите за командой Realities .io

Группа Realities.io путешествует по миру, запечатлевая самые недоступные чудеса мира. Следите за нашей историей на Youtube и Twitter.