Как я могу создать свой собственный контекст openGL и связать его с GLCanvas? - PullRequest
4 голосов
/ 14 сентября 2011

Поэтому, когда я освоил метод java

paint(Graphics g){}

, я перешел к созданию собственных методов рендеринга, но мне пришлось узнать о буферных стратегиях и о том, как получить Graphics

*.1005 * Итак, теперь я изучаю openGL, я разбираюсь с методом:
@Override
public void display(GLAutoDrawable arg0){}

и теперь я хотел бы создать свои собственные методы рендеринга, поэтому я постоянно сталкивался с одним исключением:

Исключение в потоке "main" javax.media.opengl.GLException: в этом потоке нет контекста OpenGL

EDIT: Вопрос: если я хочу сделать вызовы glDrawвне метода

@Override
public void display(GLAutoDrawable arg0){}

, как мне убедиться, что glContext моего GLCanvas является "текущим"

Желательно, как пример кода, так как я просматривал API и широко использовал googleмногие ссылки, которые вы, ребята, уже любезно вставили сюда, которые я уже нашел раньше, и я все еще рисую пробел ... буквально!Самое близкое, что у меня было, это когда он не выдавал исключение «нет текущего контекста», но экран постоянно становился черным!

Ответы [ 3 ]

3 голосов
/ 17 сентября 2011

Я нашел документацию, обсуждающую эту проблему здесь:

http://fivedots.coe.psu.ac.th/~ad/jg2/ch15/index.html

Мне кажется, что взлом GLContext.makeCurrent () / release () работает под Linux / OpenJDK 6 / JOGL 2, но мы увидим ... в частности, создание потока переключения контекста OpenGL все время, как это будет (слишком много?) накладных расходов.

Затем есть NEWT из JOGL 2 и инструментарий LWJGL, но оникажется, новый шарик воска, чтобы справиться, пока пока Swing.(

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

Дублирую мой ответ на ваш другой вопрос:

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

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

Почти все приложения JOGL работают таким образом. Вы создаете GLEventListener и реализуете в нем display (), извлекаете GL из GLAutoDrawable и используете его для выполнения вызовов рендеринга. Вы не хотите делать рендеринг вызовов в любом другом месте, равно как и делать вызовы Graphics2D вне метода paint (). (Конечно, вы можете написать подметоды, которые вызываются из метода display () и которые принимают GL или GLAutoDrawable в качестве аргумента).

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

Если вы используете низкоуровневые буферы, такие как BufferStrategy, лучше всего делать рендеринг JOGL в GLPBuffer, который является зарисовкой JOGL вне экрана. Создайте GLPBuffer, выполните рендеринг к нему, а затем скопируйте рендеринг растрового изображения в ваш буфер. Некоторые реализации GLDrawable допускают явное создание закадровых элементов рисования с помощью «createOffscreenDrawable (...). Эта статья даст вам несколько указателей.

Вы также можете явно вызывать GLDrawable.display (), если вы находитесь в потоке рендеринга.

Если вы хотите выполнить инициализацию, такую ​​как создание списка отображения, вы можете использовать метод GLDrawable.init (...), который вызывается перед первым вызовом display (...), хотя он может быть вызванным более одного раза.

0 голосов
/ 27 февраля 2012

Не спрашивайте меня, почему, но для меня (после стольких попыток) это работает как шарм

Я объявил переменную

private GLCanvas gLCanvas;

, а затем просто

gLCanvas.repaint();

сделал работу;)

...