Конфликт поведения ввода-вывода видео OfAppNoWindow и ofFbo в OpenFrameworks
Я пытаюсь сделать видео с помощью ofxVideoRecorder на безголовом сервере. Видео отображается правильно с нормальным окном, т.е.
ofSetupOpenGL(640,420, OF_WINDOW);
Тем не менее, я получаю испорченные кадры (не могу прикрепить изображение) с помощью ofAppNoWindow.
ofAppNoWindow headless;
ofSetupOpenGL(&headless,640,420,OF_WINDOW);
ofRunApp(new testApp());
Я также пробовал, из AppNoWindow без головы; headless.setupOpenGL(640420,OF_WINDOW); headless.runAppViaInfiniteLoop(new testApp());
Я отрисовываю объекты в ofFbo в методе update (). Я попытался сохранить изображение с окном и без него. Изображение сохраняется правильно без безголового окна.
Я думаю, что проблема в том, что FBO рисует неправильно с ofApppNoWindow
Это код Fbo Draw
fbo.begin();
ofClear( 255, 255, 255, 0 );
ofEnableAlphaBlending();
element.draw(); //element is my class
fbo.end();
Вот код захвата экрана.
fbo.readToPixels(pixels);
pixels.setNumChannels(3);
vidRecorder.addFrame(pixels); //ofxVideoRecorder object
Был бы признателен за любую помощь, чтобы включить практически в реальном времени видео рендеринга и записи.
2 ответа
Отвечая на мой вопрос. Благодаря @arturo на forums.openframeworks.co Надеюсь, что это поможет другим.
OfAppNoWindow не создает контекст OpenGL. Следовательно, ресурсы OpenGL, такие как FBO, недоступны. Поэтому вы не можете "читать" FBO. Это можно проверить, проверив, выделен ли fbo (fbo.isAllocated() в openFrameworks).
Мне пришлось настроить Openframeworks на удаленном частном сервере с графическим процессором от Rapidswitch, и после нескольких часов работы я смог заставить его работать.
Чтобы иметь OpenGL, у вас должен быть запущен X-сервер. Xvfb - это не вариант, потому что он не ускоряется, поэтому вам придется настроить свой Xserver без прикрепленного экрана.
Моя система Ubuntu 14.04.5 LTS
Сначала я проверил наличие графического процессора:
$ lspci | grep NVIDIA 01:00.0 VGA compatible controller: NVIDIA Corporation GM107 [GeForce GTX 750 Ti] (rev a2)
Затем я установил драйверы nvidia (я выбрал эту версию без особых причин, следуя комментарию в посте).
$ sudo apt-get install nvidia-346 nvidia-settings
я бегу
sudo nvidia-xconfig
и это вершина моего /etc/X11/xorg.conf# nvidia-xconfig: X configuration file generated by nvidia-xconfig # nvidia-xconfig: version 352.93 (buildmeister@swio-display-x86-rhel47-07) Tue Apr 5 18:55:28 PDT 2016
Затем я изменил /etc/X11/xorg.conf, добавив
AllowEmptyInitialConfiguration
опция:Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" Option "AllowEmptyInitialConfiguration" EndSection
Наконец, я мог запустить мой X-сервер на дисплее:0
sudo /usr/bin/X :0
Если все в порядке, команда запустит X-сервер с ускорением HW. Мы можем запустить glxinfo -display :0 | grep renderer
чтобы убедиться, что он действительно использует графический процессор. Это был мой вывод:
$ glxinfo -display :0 | grep renderer
OpenGL renderer string: GeForce GTX 750 Ti/PCIe/SSE2
Наконец, вы просто экспортируете свой дисплей export DISPLAY=:0
и запустить любой код OPENGL. Вы можете проверить, что это работает, на примере игрушки. glxgears
,
Это мой вывод:
$ glxgears
Running synchronized to the vertical refresh.
The framerate should be approximately the same as the monitor refresh rate.
63388 frames in 5.0 seconds = 12677.544 FPS
63382 frames in 5.0 seconds = 12676.304 FPS
...
Теперь вы готовы запустить свои проекты OpenFrameworks. Вам не нужно вносить какие-либо изменения в исходный код.