Как я могу создать свой собственный контекст openGL и связать его с GLCanvas?
Поэтому, когда я вступил в борьбу с Java
paint(Graphics g){}
метод Я перешел к созданию собственных методов рендеринга, но мне пришлось узнать о буферных стратегиях и о том, как "получить" графику.
Итак, теперь я изучаю openGL, я освоил метод:
@Override
public void display(GLAutoDrawable arg0){}
и теперь я хотел бы создать свои собственные методы рендеринга, поэтому я постоянно сталкиваюсь с одним исключением:
Исключение в потоке "main" javax.media.opengl.GLException: в этом потоке нет контекста OpenGL
РЕДАКТИРОВАТЬ: Вопрос: Если я хочу сделать вызовы glDraw вне
@Override
public void display(GLAutoDrawable arg0){}
метод, как я могу убедиться, что glContext моего GLCanvas "текущий"
Желательно, чтобы в качестве примера кода я просматривал API-интерфейсы и широко использовал Google, многие ссылки, которые вы, ребята, уже любезно вставили, я уже нашел здесь, и я все еще рисую пробел... буквально! Самое близкое, что у меня было, это когда он не выдавал исключение "нет текущего контекста", но экран просто стал черным постоянно!
3 ответа
Я нашел документацию, обсуждающую эту проблему здесь:
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.:(
Дублируем мой ответ на другой ваш вопрос:
Как ни странно, это так, как это должно работать.
За кулисами происходит то, что, когда 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(...), хотя он может быть вызван more чем один раз.
Не спрашивайте меня, почему, но для меня (после стольких попыток) это работает как шарм
Я объявил как переменную
private GLCanvas gLCanvas;
а потом просто
gLCanvas.repaint();
Сделал работу;)