Java: openGL: JOGL: Что происходит за кулисами, когда я вызываю метод display ()? - PullRequest
5 голосов
/ 14 сентября 2011

У меня есть эта строка кода:

renderableObject.renderObject(gl, glu);

Это приводит к большому списку объектов, отображаемых openGL, однако он работает только при использовании следующим образом:

@Override
public void display(GLAutoDrawable drawable)
    {               
        renderableObject.renderObject(gl, glu);
    }

Если я вызываю строку вне переопределенного метода отображения, я получаю Исключение, говорящее, что в текущем потоке нет glContext, фактически, если я вызываю любые команды gl draw вне этого метода, я получаю то же исключение

теперь в идеале я хочу создать множество списков отображения один раз, а затем визуализировать их каждый кадр с нечетным списком отображения для периодического воссоздания. Однако я должен пройти через этот единственный метод display (), что означает, что мне придется проверять каждый кадр, если список отображения был создан или нуждается в изменении и т. Д. ... 60 раз в секунду! какая трата вычислительной мощности, когда я мог бы обрабатывать их по отдельности, когда это необходимо.

Итак, что бы ни вызывал метод display (), я бы хотел иметь возможность его тиражировать, что позволило бы мне создавать множество собственных пользовательских методов отображения, не проходя этот единственный метод для всего!

Так есть ли простой вызов GL, который я могу сделать сам?

1 Ответ

2 голосов
/ 15 сентября 2011

Как ни странно, но так и должно быть.

За кулисами происходит то, что, когда GLCanvas, который вы создали, начинает рисоваться, за кулисами JOGL выполняет целую кучу работы. Он создает GLContext и делает его текущим для GLCanvas для текущего потока. Только когда это будет сделано, вы сможете делать рендеринг звонков. GLContext, который не был сделан текущим, или объект GL, являющийся его производным, бесполезен для вас. Кроме того, GLContext становится текущим только для этого потока , и становится не текущим, как только завершается вызов дисплея, поэтому удержание ссылки на него или GL для последующего использования не будет работать .

Почти все приложения JOGL работают таким образом. Вы создаете GLEventListener и реализуете в нем display (), извлекаете GL из GLAutoDrawable и используете его для выполнения вызовов рендеринга. Вы не хотите делать рендеринг вызовов в любом другом месте, равно как и делать вызовы Graphics2D вне метода paint (). Большинство начинающих Java-программистов пытаются рисовать вне метода рисования; это похоже. Если вам нужно запустить перерисовку, то вы делаете это так же, как и в Java2D: используйте invalidate (). (Конечно, вы можете написать подметоды, которые вызываются из метода display () и которые принимают GL или GLAutoDrawable в качестве аргумента).

Есть способы для вас специально создать GLContext и сделать его текущим самостоятельно, но они редко необходимы. Здесь почти всегда лучше использовать подход.

...