Фон
У меня есть программа для разработки систем управления автомобилем, которая использует комбинацию языка сценариев TCL и OpenGL для дополнительной визуализации поведения автомобиля при движении по дороге.
Что я делаю, так это реализую для него поддержку OculusRift, и до сих пор мне удалось решить сенсорную часть, и, щелкнув правой кнопкой мыши окно, в котором едет машина, я могу отправить его в oculus rift. Пока это выглядит так: Youtube-Video
Визуальная часть программы уже имеет множество функций и включает в себя такие параметры, как настройка FOV, объективов типа «рыбий глаз», ориентация камеры, вид изнутри автомобиля и т. д.
Осмотрев папку с программным обеспечением, я нашел файл TCL со следующими строками:
// ... cut here
gl pushmatrix
gl loadidentity
gl translate $x $y $z
gl rotate $xrot 1 0 0
gl rotate $yrot 0 1 0
gl rotate $zrot 0 0 1
gl translate $offx $offy $offz
lassign [lrange [OGL get modelviewmatrix] 12 14] tx ty tz
gl popmatrix
dict set ::View($view) CameraMode FixedToBodyA
dict set ::View($view) xrot $xrot
dict set ::View($view) yrot $yrot
dict set ::View($view) zrot [expr $zrot + $zrot_eyeAngle]
dict set ::View($view) dist $conf(dist)
dict set ::View($view) VPtOffset_x $tx
dict set ::View($view) VPtOffset_y $ty
dict set ::View($view) VPtOffset_z $tz
dict set ::View($view) FieldOfView $conf(fov)
dict set ::View($view) AspectRatio $conf(AspectRatio)
return;
}
Я не нашел ни одной строки, которая обрабатывает сам рендеринг, но команды "gl" было достаточно, чтобы я понял, что этот файл TCL запускается непосредственно в процессе рендеринга. Поэтому я расширил вышеизложенное следующим образом:
// load a self written DLL that wraps OVR functionality (Github link bellow)
# now run tclovrGetData() from the loaded DLL to get sensor data
set data [tclovrGetData]
// data = x y z xrot yrot zrot
gl pushmatrix
gl loadidentity
gl translate $x $y $z
gl rotate $xrot 1 0 0
...
Как вы можете видеть на видео, на мониторе все выглядит хорошо, но, как мы знаем, линзы Rift вносят искажения (которые для меня были незначительными) и некоторые хроматические аберрации.
Моя идея
Я хочу захватить это «изображение/текстуру/кадр» на экране в видео каждые 10-20 мс (я все еще новичок в терминологии) и выполнить для него некоторую цветовую фильтрацию (я хочу посмотреть, смогу ли я уменьшить Хроматическая аберрация). Затем, возможно (чтобы все было независимо), создайте новое окно с измененным изображением и отправьте его в Rift. В основном получите изображение в требуемом «формате», чтобы иметь возможность выполнять на нем вычисления.
Моя идея заключалась в том (поскольку мы привязаны к процессу рендеринга) добавить несколько дополнительных строк в вышеуказанный файл TCL, которые вызывают дополнительные функции внутри моей DLL, которые могут делать следующее:
// Begin Oculus rendering loop
//1. get frame that is currently being rendered (in this process)
//2. copy this frame to memory
//3. perform some operations (color filtering) on this frame in memory
//4. send this frame to a new window
Теперь мой вопрос:
- Возможно ли что-то подобное?
- Может ли кто-нибудь указать мне правильное направление? т.е. некоторые функции gl, которые я мог бы использовать?
- Может, Direct3D тоже работает?
Я прочитал этот пост в stackoverflow, но не смог понимать :/