Конфликт поведения ввода-вывода видео 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. Вам не нужно вносить какие-либо изменения в исходный код.

Другие вопросы по тегам