2014-09-02 4 views
2

Я работаю в области VR, где хорошая калибровка проецируемого экрана очень важна и из-за трудно регулируемых потолочных креплений и других особенностей оборудования , Я ищу полноэкранный шейдерный метод, чтобы «исправить» форму экрана.Способ устранения деформации видеопроектора с помощью полноэкранного шейдера GLSL/HLSL

Большинство 2D или 3D-движков позволяет применять полноэкранный эффект или деформацию, перерисовывая результат рендеринга на квадроцикле, который вы можете деформировать или визуализировать по-своему.

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

В моем целевом случае:

  • Деформация изображения должна быть нелинейной большой частью времени, так что 9 или 16 контрольных точки необходимы для получения более тонкой регулировки.
  • Границы изображения не являются прямыми (эффект ствола или подушки), поэтому даже с небольшим количеством контрольных точек изображение должно быть искажено изогнутым способом между ними. В противном случае деформация создавала бы видимые линейные швы между границами каждой контрольной точки. идеал, зная исправленное положение каждого контроль точек 3x3 или 4x4 сетки, то, как был бы определить непрерывное преобразование для текстурных координат изображений втягивается на всем экране четверные:

у , v => corrected_u, corrected_v

Вы можете найти иллюстрацию here.

  • Я видел некоторый алгоритм FFD, который работает в 2D или 3D, которая позволила бы деформировать «мягко» изображение или сетка, как если бы она была сделана из резины, но the implementation seems heavy for a real-time shader.
  • Я думал также о деформации, основанной на весе, как у нас в анимации скелета/мягких тел, но кажется неуверенным правильно взвешивать контрольные точки. Знаете ли вы метод, алгоритм или общий подход, который может помочь мне решить проблему?
  • Я видел некоторые деформации на основе сетки, такие как новый Oculus Rift DK2, требует собственных деформаций, но большая часть 2D/3D-движка использует только один квад, состоящий из 4 вершин только в стандартном исполнении.

ответ

0

Если вам нужна нелинейная деформация Bezier Surfaces очень удобны и просты в применении.

Вы можете предварительно создать их в CPU, или использовать аппаратные тесселяции (например, при условии here)

+0

Спасибо за ваш вклад. Действительно, я использовал эти уравнения для интерполяции смещений, которые я использовал. косинусная интерполяция была не тем, что мне нужно в большинстве случаев. Я использовал квадратичные коэффициенты из безье (vec4 ((1.0-x) * (1.0-x), (x) * (1.0-x), (x * x), 1.0)) и умножьте их на значения ключей, соответствующие «0.0», «0.5» и «1.0». Довольно мило :) – user2015926

0

Продолжая мое исследование, я нашел способ. Я создал 1D текстуру RGB, соответствующую значениям «рампы» или косинуса. Это будет 3 коэффициента влияния смещенных параметров на оси 0..1 с тремя коэффициентами при 0, 0,5 и 1:

  • Красный начинается с 1 при x = 0 и опускается до 0 при x = .5
  • Зеленый старт при 0 при x = 0, переходит в 1 при x = 0,5 и возвращается к 0 при x = 1
  • Синий начинается с 0 при x = 0,1 и идет до 1 при x = 1

С этими формами из 9 форм float2 я могу очень легко интерполировать мои параметры по изображению (с тремя поисковыми запросами по горизонтали и окончательным по вертикали).

Затем, один интерполированный, я смещает текстуру координировать с ними, и это работает :-D Это более или менее взвешенная интерполяция координат с использованием текстурных поисков для ускорения.