Рисуй за кадром с помощью JOGL - PullRequest
4 голосов
/ 21 января 2009

В рамках более крупного проекта я пытаюсь реализовать средство, использующее JOGL, которое будет экспортировать 3D-рендеринг в растровые форматы. Мы делаем это, создавая GLJPanel и рисуя нужную ему сцену, затем извлекая растровое изображение. Все это прекрасно работает, если у системы есть хотя бы одно видимое окно на экране - не обязательно окно, содержащее панель, на которую мы рисуем.

Но если мы попытаемся сделать это без отображения окна, GLJPanel не будет рисовать. Проходя по источнику JOGL, я обнаружил, что он не будет отрисовываться, если у него нет действительного однорангового узла - по сути, если для него не был вызван addNotify (). В документации говорится, что addNotify () вызывается только тогда, когда панель становится частью иерархии видимого окна. Переход на GLCanvas не имеет большого значения - режим сбоя другой. WindowsOnscreenGLDrawable.realized не установлен, и это означает, что lockSurface возвращает LOCK_SURFACE_NOT_READY, что приводит к сбою makeCurrent ().

Приветствуется любая помощь в создании Java-приложения, которое может создавать и экспортировать 3D-сцены без необходимости отображать его окно.

Ответы [ 2 ]

5 голосов
/ 21 января 2009

Не уверен, должен ли я отвечать на свой вопрос, но здесь идет речь о том, что я нашел, кажется, работает сейчас.

Ключ GLPbuffer , который является закадровым GLAutoDrawable и может быть создан без видимой иерархии компонентов.

Эта статья была полезна для того, чтобы заставить ее работать. Я перестану принимать этот ответ, пока не подтвердил, что он полностью функционален.

Я должен также сказать, что ответ пришел с этого форума , а не из моего собственного скудного мозга.

0 голосов
/ 21 января 2009

Вы должны посмотреть на метод: glReadPixels () подробнее здесь . В основном это работает примерно так:

Init(); //doing some initializations in your JOGL app

glDrawBuffer(GL_BACK);

DrawGLScene(); //doing drawing here

glReadBuffer(GL_BACK);

//Copy the image to the array imageData
glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 
...