Как я могу создать свой собственный контекст openGL и привязать его к GLCanvas?



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



paint(Graphics g){}


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



Итак, теперь я изучаю openGL, я должен справиться с методом:



@Override
public void display(GLAutoDrawable arg0){}


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




Исключение в потоке" main " javax.средства массовой информации.использование OpenGL.GLException: Нет OpenGL
контексте текущего на этой нити




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



@Override
public void display(GLAutoDrawable arg0){}


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



Предпочтительно в качестве примера кода, поскольку я просмотрел api и использовал Google extensivly, многие ссылки, которые вы, ребята, уже были так любезны, чтобы поместить сюда, я уже нашел раньше, и я все еще рисую пробел... в буквальном смысле! Ближе всего я получил, когда он не бросил исключение "нет текущего контекста", но экран просто стал черным насквозь!

581   3  

3 ответов:

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

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

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

Затем есть Тритон из jogl 2 и инструментарий LWJGL, но они кажутся совершенно новым шаром воска для обработки, пока-пока качели. : (

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

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

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

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

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

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

Можно также вызвать GLDrawable.display () явно, при условии, что вы находитесь в потоке визуализации.

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

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

Я объявлен как переменная

private GLCanvas gLCanvas;

А потом просто

gLCanvas.repaint();

Сделал свое дело;)

Comments

    Ничего не найдено.