jogl родной сбой при вызове glDisable - PullRequest
0 голосов
/ 13 января 2012

У меня есть приложение jogl, которое (нативно) рушится при вызове glDisable (я не думаю, что особенности стека здесь важны - это вызов, происходящий в EDT).

Мой вопрос на самом деле о том, как возможно, что glDisable может вызвать нативный сбой. Всегда передается действительный флаг для отключения.

У меня есть две мысли по этому поводу:

1) Ошибка графической карты (хотя я пытался обновить драйверы, но все же это происходит только на некоторых компьютерах, поэтому возможно, что это связано с картой).

2) Приложение Java использует большой объем памяти. Я не знаю, возможно ли, что если выделено слишком много памяти, могут произойти плохие вещи в нативном коде. Хотя если бы интенсивно использовалась только память Java, а не вся системная память, я бы подумал, что ошибка будет отображаться как ошибка Java.

Есть мысли о том, как это могло бы на самом деле произойти?

1 Ответ

1 голос
/ 13 января 2012

Большую часть времени OpenGL будет обрабатывать свои собственные ошибки, просто игнорируя вызов с ошибкой, но есть несколько ошибок, которые могут привести к сбою вашего приложения.Единственные, с кем я когда-либо сталкивался, - это нарушения прав доступа и плохие драйверы.У меня такое ощущение, что это не вызов glDisable (который может вызвать только ошибку GL_INVALID_ENUM или GL_INVALID_OPERATION, которую сам OpenGL обрабатывает с помощью glGetError), а тот, что был до этого.

было бы неплохо взглянуть на код ошибки, но я собираюсь предположить, что это либо во время загрузки текстуры (glTexImage2D), либо при вызове отрисовки (gl*Pointer или glDraw*).Если ваши переменные длины больше, чем память, которая фактически предназначена для текстуры / буфера, OpenGL все равно будет пытаться читать с этих адресов, и ОС должна выдать исключение нарушения доступа.Дважды проверьте эти переменные и помните, что все используют длину в байтах, кроме вызовов glDraw*, которые используют количество элементов.

Если это не ваша проблема, то ваш вызов glDisable является первым фактическим вызовом OpenGL, который выmake и ошибка в том, что JOGL не может найти opengl32.dll или libgl.so или какую-либо реализацию OpenGL в вашей ОС.В этом случае вам просто нужно установить соответствующие драйверы, и это будет работать.Иногда, если вы вызываете метод, который был представлен в OpenGL в версии, после которой ваш драйвер поддерживает, вы получите ту же ошибку.Вы можете проверить свою версию OpenGL с glGetString(GL_VERSION).

...