возможно ли визуализировать объект фреймбуфера вне основного цикла рендеринга

Я использую отдельный объект кадрового буфера для выбора цвета 2D-объектов в opengl. Мне любопытно, можно ли рисовать только в буфере кадра и читать цвет, когда это необходимо.

что я делаю сейчас, так это в основном цикле рендеринга, я рисую сцену в основной фреймбуфер, а затем визуализирую только выбираемые объекты в фреймбуфер «выбора».

когда пользователь щелкает мышью, он связывает кадровый буфер «выбора» и считывает пиксель, и я знаю, какой объект выбран. проблема в том, что мне нужен "выбор" кадрового буфера только тогда, когда пользователь щелкает мышью, поэтому делать это каждый кадр неэффективно.

Я пробовал рендеринг в кадровый буфер «выбора», когда пользователь щелкает мышью, а затем читает напрямую, но все, что я получаю, это белый цвет (цвет фона, а не цвет, чтобы сказать мне, какой это объект). рисование кадрового буфера «выбора» просто показывает все это как белое, как будто на самом деле ничего не было визуализировано.

мне нужно остановить отрисовку в основном цикле при рендеринге в «выбор» фреймбуфера? или есть что-то, чего мне не хватает, что сделало бы это возможным?

РЕДАКТИРОВАТЬ: я пытался не рисовать в основном цикле при рендеринге в кадровый буфер выбора, и это тоже не сработало.


person cuatro    schedule 04.11.2010    source источник
comment
Вы glFlush() между рисованием и чтением?   -  person genpfault    schedule 05.11.2010
comment
я делаю. Я думаю, что ответ «Нет» может быть правильным.   -  person cuatro    schedule 05.11.2010
comment
Вы делаете это одновременно?   -  person tibur    schedule 05.11.2010
comment
Неа. Я пробовал все известные мне последовательные способы, и единственный, который работает, — это когда я рендерю fbo выбора, в то время как я рендерю обычный фреймбуфер, что не так уж важно на современном оборудовании (возможно, 5%), но на более старых вещах это может быть ближе к Падение производительности ~30-40%.   -  person cuatro    schedule 05.11.2010
comment
Если вы не в многопоточном приложении и только с одним контекстом, это должно работать. Проверьте, почему рендеринг FBO должен выполняться сразу после обычного рендеринга. (Матрицы, Текстуры, ...)   -  person tibur    schedule 05.11.2010
comment
да, я еще немного возиться с этим, чтобы увидеть, если я не могу заставить его работать.   -  person cuatro    schedule 05.11.2010


Ответы (2)


Вам нужно убедиться, что вы сделали свой контекст GL текущим, используя либо wglMakeCurrent, либо glXMakeCurrent. Кроме того, это должно быть сделано в одном и том же потоке, так как только один поток может иметь текущий контекст.

person tibur    schedule 04.11.2010
comment
Я пытался убедиться, что контекст был правильным, с тем же результатом. - person cuatro; 05.11.2010

"No".

Но вы можете использовать несколько графических процессоров (если они у вас есть). Здесь или здесь вы можете найти спецификацию OpenGL; драйвер должен поддерживать расширение *WGL_NV_gpu_affinity* или *AMD_gpu_association*.

person Luca    schedule 04.11.2010
comment
Это предотвратит проблемы с производительностью при рендеринге в двух контекстах OpenGL в одно и то же время в разных потоках. Но для доступа к этим расширениям вам нужен профессиональный графический процессор. - person tibur; 05.11.2010