Java >> Java-zelfstudie >  >> Java

Hoe een GL2-instantie ophalen?

Ik ben momenteel een spel aan het schrijven met de JOGL-bindingen om OpenGL te gebruiken, maar ik heb hier zo veel moeite mee.

Ik moet mijn vaos en vbos (voor elke component) initialiseren met behulp van de GL2-variabele die ik heb verzameld in de init-methode in de klasse die GLEventListener implementeert. Vind ik leuk,

public abstract class Scene implements GLEventListener {
    private GL2 gl;

    @Override
    public void init(GLAutoDrawable drawable) {
        gl = drawable.getGL().getGL2();
        ...

Maar deze variabele is null wanneer ik hem wil gebruiken, omdat het lijkt alsof hij vóór de aanroep van de methode init staat (wat mij vreemd is). Ik heb ook GLContext.getCurrent() gecontroleerd om misschien een GL-instantie op te halen, maar de context is ook null.

Dus ik vraag me af waar de context wordt gemaakt en wat de bovenstaande init-functie activeert?

Misschien zou ik gewoon een boolean kunnen maken die aangeeft wanneer een component is geïnitialiseerd in mijn renderfunctie, dus misschien zou de GL init-methode zijn aangeroepen.

Antwoord

De GL-context wordt meestal gemaakt wanneer het venster voor de eerste keer zichtbaar wordt gemaakt, maar het is platformspecifiek - kan zijn wanneer het venster wordt gemaakt, mogelijk direct voordat uw programma begint te tekenen. De methode init() wordt aangeroepen vóór de eerste display() maar nogmaals, er is geen garantie over wanneer dit precies gebeurt.

Mijn advies voor JOGL is om de GL-context niet permanent op te slaan. In plaats daarvan begint elke init(), display(), reshape() met

GL2 gl = drawable.getGL().getGL2();

Op sommige platforms zal het proberen om de GL-context buiten een van deze methoden te gebruiken niet werken/het programma laten crashen, dus als u de context lokaal maakt, hoeft u ook geen code te schrijven die dit zou kunnen doen.

Het is ook mogelijk dat de context kan veranderen als de gebruiker zegt dat het venster naar een scherm wordt verplaatst dat wordt bestuurd door een andere GPU.


Java-tag