Auf Thema antworten

Moin,




gute Frage ;), hab das GLContext.getCurrentGL() vorher auch noch nie genutzt. Im JavaDoc steht ja lediglich:




In den ersten Versuchen gerade, scheint es wohl tatsächlich immer das selbe GL zurückzugeben, das man auch durch das GLAutoDrawable bekommt. Beim Multikontext (2x GLJPanel) und beim nativen GLWindow scheint es auch zu gehen.



  


Sagen wir, ich hoffe, dass das alles wieder gelöscht wird ;). Nachdem was ich bisher vom GLCanvas und GLJPanel gesehen hab und mit dem was ich noch von meinen OpenGL Versuchen in C weis, würde ich vermuten das da nichts passieren dürfte.


Beim GLCanvas hätte man ja noch die Möglichkeit über das dispose() aufzuräumen, aber beim GLJPanel ist der Kontext ja einfach weg.


Zum Testen hab ich gerade mal folgendes ausprobiert (vollkommen fernab allen sinnvollen :D ):


[code=Java]package late.gl.jogl2.base;


import java.awt.Frame;

import java.nio.FloatBuffer;

import java.util.Random;


import javax.media.opengl.GL;

import javax.media.opengl.GL2;

import javax.media.opengl.GLAutoDrawable;

import javax.media.opengl.GLEventListener;

import javax.media.opengl.awt.GLCanvas;

import javax.media.opengl.fixedfunc.GLMatrixFunc;

import javax.media.opengl.fixedfunc.GLPointerFunc;

import javax.media.opengl.glu.GLU;


import com.sun.opengl.util.Animator;

import com.sun.opengl.util.BufferUtil;


public class Test implements GLEventListener {


    private static final Random random    = new Random(System.currentTimeMillis());

    private static final int    vboSize   = 100000;


    private final Object        monitor   = new Object();


    private volatile int        initCount = 0;

    private int                 vboHandle = 0;


    private GL2                 gl;

    private GLU                 glu;



    @Override

    public void init(final GLAutoDrawable drawable) {


        synchronized (monitor) {


            System.out.println("init: " + initCount);


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

            glu = new GLU();


            final FloatBuffer buffer = BufferUtil.newFloatBuffer(vboSize);


            for (int i = 0; i < buffer.capacity(); i++)

                buffer.put(random.nextFloat() - 0.5f);


            buffer.rewind();


            final int[] vboHandleBuffer = new int[1];

            gl.glGenBuffers(1, vboHandleBuffer, 0);

            vboHandle = vboHandleBuffer[0];


            gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vboHandle);

            gl.glBufferData(GL.GL_ARRAY_BUFFER, vboSize * (Float.SIZE / Byte.SIZE), buffer, GL.GL_STATIC_DRAW);

            gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);


            gl.glEnableClientState(GLPointerFunc.GL_VERTEX_ARRAY);


            initCount++;


        }


    }



    @Override

    public void display(final GLAutoDrawable arg0) {


        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);


        gl.glLoadIdentity();

        gl.glRotatef(initCount, 0, 0, 1);

        gl.glTranslatef(0.0f, 0.0f, -1.0f);


        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vboHandle);

        gl.glVertexPointer(2, GL.GL_FLOAT, 0, 0);

        gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, vboSize);

        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);


    }



    @Override

    public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, int height) {


        if (height <= 0)

            height = 1;


        gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);

        gl.glLoadIdentity();

        glu.gluPerspective(45.0f, (float) width / (float) height, 1.0, 1000.0);

        gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);

        gl.glLoadIdentity();


    }



    public static void main(final String[] args) {


        final Test main = new Test();

        final Frame frame = new Frame();

        final GLCanvas canvas = new GLCanvas();

        final Animator animator = new Animator(canvas);


        canvas.addGLEventListener(main);


        frame.add(canvas);

        frame.setSize(900, 500);

        frame.setLocationRelativeTo(null);

        animator.start();



        new Thread(new Runnable() {


            @Override

            public void run() {


                while (main.initCount < 1500) {


                    synchronized (main.monitor) {


                        frame.setVisible(true);

                       

                    }


                    try {

                        Thread.sleep(200);

                    } catch (final InterruptedException e) {


                    }


                    synchronized (main.monitor) {

                      

                        frame.setVisible(false);

                        frame.dispose();


                    }


                }


                System.exit(0);


            }

        }).start();


    }



    @Override

    public void dispose(final GLAutoDrawable drawable) {


    }


}[/code]


Und es läuft (zumindest hier) sauber bis zum Ende durch (dürfte es aber nicht wenn der Grafikkartenspeicher zwischendurch nicht aufgeräumt werden würde).



  


Und ich hab schon ein schlechtes Gewissen wenn ich eine Map static mache. ;)


LWJGL geht ja auch so einen static Ansatz. Du musst Dir dann nur ganz sicher sein niemals ein zweites GLJPanel (als Multikontextanwendung) einbauen zu wollen, das dürfte mit dem static Ansatz dann nämlich schwer (unmöglich?) werden.





Leider nein, zumindest keine von einem der beiden. Ich hab eben auf Java? Binding for the OpenGL® API: General Discussion: Will JOGL be moving back to java.net? &mdash; Project Kenai noch mal was von Michael Bien gelesen bzgl. dem Ende von kenai (auch wenn die sourcen da nicht mehr liegen, so war es doch bisher immerhin so was wie "die" Projektseite von JoGL. Nuja, jetzt scheint es so, dass es nach dem schließen von kenai (am 2.4.10) keine Projektseite mehr zu JoGL gibt (nur noch github und den hudson).


Ich finde das etwas erschreckend. :(


Gruß,

Fancy



Oben