# Opengl Texture laden Null Pointer Exception



## JavaKing (27. Aug 2008)

Hallo,

ich habe gerade mit einem merkwürdigem Problem zu kämpfen. Und zwar lade ich mit folgender Routine eine Texture:


```
// Texturenvariablen festlegen
    Texture seite;

            seite = TextureIO.newTexture(getClass().getResource("bild1.jpg"), true, null); 
            seite.setTexParameteri(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            seite.setTexParameteri(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            seite.setTexParameteri(GL_TEXTURE_WRAP_S, GL_CLAMP);
            seite.setTexParameteri(GL_TEXTURE_WRAP_T, GL_CLAMP);
```

Dies funktioniert bei bild1.jpg perfekt. Sie wird dann einfach auf einem GL_QUADS gebunden. Läuft...
Jetzt habe ich mir verschiedene andere Bilder/Texturen heruntergeladen und wollte diese ebenfalls so einbinden.
Ich habe die Größe entsprechend angepasst 2^n. Leider bekomme ich folgende Fehlermeldung :


```
Exception in thread "Thread-2" javax.media.opengl.GLException: java.lang.NullPointerException
        at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:271)
        at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:410)
        at javax.media.opengl.GLCanvas.display(GLCanvas.java:244)
        at com.sun.opengl.util.Animator.display(Animator.java:144)
        at com.sun.opengl.util.Animator$MainLoop.run(Animator.java:181)
        at java.lang.Thread.run(Thread.java:595)
[b]Caused by: java.lang.NullPointerException[/b]
        at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:523)
        at projekt.Projekt.init(Projekt.java:126)
        at com.sun.opengl.impl.GLDrawableHelper.init(GLDrawableHelper.java:72)
        at javax.media.opengl.GLCanvas$InitAction.run(GLCanvas.java:418)
        at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:189)
        at javax.media.opengl.GLCanvas$DisplayOnEventDispatchThreadAction.run(GLCanvas.java:452)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
```

Ich hab es z.b. mit png versucht aber auch bei jpg kommt dieser Fehler. 

Die Werte des bild1.jpg
512x512 pixel
72dpi
Bittiefe 24

Werte von bild2.jpg identisch bzw. auch mal mit 1024x1024 pixel


----------



## Marco13 (27. Aug 2008)

Schwer zu sagen. Wenn du sicher bist, dass das Bild da ist, kannst du ggf. nochmal versuchen, das Laden von Bild1 auszukommentieren, und nur Bild2 zu versuchen. Wenn das nicht funktioniert, liegt es am Bild - wenn es funktioniert (und das Problem DANN bei Bild3 aufrtritt) ist vielleicht der Zeitpunkt des Ladens falsch oder so ... er scheint da ja gerade in einem "display" zu sein - vielleicht kannst du die Bilder laden, _bevor_ das erste mal was angezeigt wird oder so....? (Ist aber nur wild-wüst undfundiert geraten....)


----------



## JavaKing (27. Aug 2008)

Marco13 hat gesagt.:
			
		

> Schwer zu sagen. Wenn du sicher bist, dass das Bild da ist, kannst du ggf. nochmal versuchen, das Laden von Bild1 auszukommentieren, und nur Bild2 zu versuchen. Wenn das nicht funktioniert, liegt es am Bild - wenn es funktioniert (und das Problem DANN bei Bild3 aufrtritt) ist vielleicht der Zeitpunkt des Ladens falsch oder so ... er scheint da ja gerade in einem "display" zu sein - vielleicht kannst du die Bilder laden, _bevor_ das erste mal was angezeigt wird oder so....? (Ist aber nur wild-wüst undfundiert geraten....)



Also das Bild ist definitiv da, ist im gleichen Ordner wie alle anderen auch. Also ich habe mal alles auskommentiert und nur diese eine Routine geladen. Mit bild1 geht es mit bild2 nicht. Es ist zum Haare ausreißen !
bild2 ist nun sogar ein Bild das bei einem anderen opengl Projekt einwandfrei funktioniert hat !


----------



## JavaKing (29. Aug 2008)

Ich habe das Problem leider immernoch.  
Weiß denn niemand eine Lösung ? evtl. eine andere Lade Routine ?
Bin für jeden Vorschlag dankbar.


----------



## Marco13 (29. Aug 2008)

Eine Testprogramm und die zwei Bilder, bei denen es einmal geht und einmal nicht, wäre wohl zu aufwändig? Naja, selbst wenn - mit einer Antwort wie "Bei mir geht's" oder "Bei mir geht's auch nicht" könntest du wohl eh nichts anfangen...


----------



## Fancy (30. Aug 2008)

Moin,

also das sollte so eigentlich gehen. TextureIO unterstützt unter anderem sowohl JPG als auch PNG. Texture verhält sich abhängig von den Bildparametern weitgehend intelligent. Die verwendeten Texturen müssen keine Auflösung von 2^n aufweisen.

Ich würde vermuten:
-	Dein "bild2.jpg" ist nicht da wo Du denkst
-	Dein JAVA sucht nicht da wo Du denkst
-	Dein "bild2.jpg" ist fehlerhaft

Versuche mal ein:

```
System.out.println(getClass().getResource("/bild2.jpg");
```

Als Beispiel wie es bei mir geht:


```
package fancy.jf.texture;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.nio.FloatBuffer;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLException;
import javax.media.opengl.glu.GLU;

import com.sun.opengl.util.Animator;
import com.sun.opengl.util.BufferUtil;
import com.sun.opengl.util.texture.Texture;
import com.sun.opengl.util.texture.TextureIO;

public class Tex implements GLEventListener {

    
    private static final float[] staticVertices = new float[] {
        1.0f,  1.0f, 
       -1.0f,  1.0f,  
       -1.0f, -1.0f, 
        1.0f,  1.0f,
       -1.0f, -1.0f, 
        1.0f, -1.0f};
    
    private static final float[] staticTexCord = new float[] {
        1.0f, 1.0f, 
        0.0f, 1.0f,  
        0.0f, 0.0f, 
        1.0f, 1.0f, 
        0.0f, 0.0f,   
        1.0f, 0.0f};


    private GL                   gl                  = null;
    private GLU                  glu                 = null;

    private FloatBuffer          vertexArrayVertices = null;
    private FloatBuffer          vertexArrayTexture  = null;

    private Texture[]            texture             = null;


    @Override
    public void init(GLAutoDrawable drawable) {

        gl = drawable.getGL();
        glu = new GLU();

        vertexArrayVertices = BufferUtil.newFloatBuffer(staticVertices.length);
        vertexArrayVertices.put(staticVertices, 0, staticVertices.length);
        vertexArrayVertices.rewind();

        vertexArrayTexture = BufferUtil.newFloatBuffer(staticTexCord.length);
        vertexArrayTexture.put(staticTexCord, 0, staticTexCord.length);
        vertexArrayTexture.rewind();

        texture = new Texture[2];

        try {

            for (int i = 0; i < texture.length; i++) {
                texture[i] = TextureIO.newTexture(getClass().getResource("/v" + i + ".jpg"), true, null);
                texture[i].setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
                texture[i].setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
                texture[i].setTexParameteri(GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP);
                texture[i].setTexParameteri(GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP);
            }

        } catch (GLException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

        gl.glShadeModel(GL.GL_SMOOTH);
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
        gl.glClearDepth(1.0f);
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glDepthFunc(GL.GL_LEQUAL);
        gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);

        gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);
        gl.glEnable(GL.GL_TEXTURE_2D);
    }


    @Override
    public void display(GLAutoDrawable drawable) {

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

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

        for (int i = 0; i < texture.length; i++) {
            texture[i].bind();
            gl.glVertexPointer(2, GL.GL_FLOAT, 0, vertexArrayVertices);
            gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, vertexArrayTexture);
            gl.glDrawArrays(GL.GL_TRIANGLES, 0, staticVertices.length);

            gl.glTranslatef(2.0f, 0.0f, 0.0f);
        }

    }


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

        if (height <= 0) height = 1;

        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, (float) width / (float) height, 1.0, 20.0);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }


    @Override
    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}

    public static void main(String[] args) {

        final Frame frame = new Frame();
        final GLCanvas canvas = new GLCanvas();
        final Animator animator = new Animator(canvas);
        canvas.addGLEventListener(new Tex());
        frame.add(canvas);
        frame.setSize(500, 500);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                new Thread(new Runnable() {
                    public void run() {
                        animator.stop();
                        System.exit(0);
                    }
                }).start();
            }
        });
        frame.setVisible(true);
        animator.start();
    }

}
```

Ansonsten, wie bereits von Marco vorgeschlagen, poste mal dein "bild2.jpg".

Gruß,
Michael


----------



## JavaKing (1. Sep 2008)

Das Thema hat mich jetzt echt zur Weißglut gebracht, tut es immer noch.
Ich denke aber ich habe eine Teil-Lösung gefunden. Es hat weder etwas mit dem Bild noch mit meiner Laderoutine zu tun.
Da ich leider auf 2 verschieden Entwicklungsversionen entwickeln muss, einmal Netbeans IDE 5.0 und IDE 6.1. Ist mir jetzt aufgefallen das bei IDE 6.1 alles reibungslos funktioniert. Ich kann die images in Unterverzeichnisse legen, sie können sogar gif sein oder verschiedenste Auflösungen haben. Es geht ! Aber auch erst als ich mein Projekt von meinem fast vollem (20-100MB noch frei) Speicherstick auf die Festplatte kopiert habe.

Jetzt als ich das Projekt wieder mit IDE 5.0 öffnen will compiliert er alles richtig, schmeißt mir aber beim öffnen wieder den gleichen Fehler. -> Null Pointer Exception.
Alles irgendwie sehr merkwürdig...


----------

