# java /jogl /Texturen mit j3d



## simsche (2. Jun 2009)

hallo,

ich versuche 2 Vierecke mit einer Textur (einem gif) zu versehen. Doch leider werden diese nicht mit der Textur gefüllt, sondern nur mit der Standardfarbe.

Mein Code dafür lautet:
//	Texturen werden geladen      
	  TextureLoader loader = new TextureLoader("stripe.gif", this);
	  //   Retrieve the ImageComponent from the TextureLoader
	  ImageComponent2D image = loader.getImage();


	  gl.glEnable(GL.GL_TEXTURE_2D);
      Texture2D texture = new Texture2D(Texture.BASE_LEVEL, 
      Texture.RGB, 
      image.getWidth(), 
      image.getHeight());
      texture.setImage(0, image); 

      Appearance app1 = new Appearance();
      app1.setTexture(texture);

      gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
      gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);


//    replace the quad colours with the texture
      gl.glPolygonMode(GL.GL_FRONT_AND_BACK,GL.GL_FILL);
      gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE,
      GL.GL_REPLACE);

      gl.glBegin(GL.GL_QUADS); 

      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-2.0f, -1.0f, 0.0f);    
      gl.glTexCoord2f(0.0f, 3.0f); gl.glVertex3f(-2.0f, 1.0f, 0.0f); 
      gl.glTexCoord2f(3.0f, 3.0f); gl.glVertex3f(0.0f, 1.0f, 0.0f); 
      gl.glTexCoord2f(3.0f, 0.0f); gl.glVertex3f(0.0f, -1.0f, 0.0f); 



      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 0.0f); 
      gl.glTexCoord2f(0.0f, 3.0f); gl.glVertex3f(1.0f, 1.0f, 0.0f); 
      gl.glTexCoord2f(3.0f, 3.0f); gl.glVertex3f(2.41421f, 1.0f, -1.41421f); 
      gl.glTexCoord2f(3.0f, 0.0f); gl.glVertex3f(2.41421f, -1.0f, -1.41421f); 
      gl.glEnd();

Ich verstehe einfach nicht, warum diese nicht gefüllt werden - eigentlich habe ich alles beachtet - so wie es in unzähligen Foren und Hilfen beschrieben ist. Wer kann mir sagen, wo mein Fehler liegt? Das Bild (gif ) hat auch die entsprechende Größe (8x16, a la 2er-Potenz)...


----------



## Spacerat (2. Jun 2009)

Ähmmm... Ich vermisse irgendwie Apearance und ImageComponent2D in JOGL 
Aber mal Scherz beiseite... Texturen funktionieren in JOGL gaaanz anders. Hier sind so'n paar Tuts, die ich immer wieder gerne empfehle. Unter anderem erfährt man dort auch, wie das mit Texturen geht. Opengl - Tutorials


----------



## simsche (3. Jun 2009)

danke für die Antwort Spacerat - hat aber bei mir nicht so ganz hingehauen, deshalb habe ich nun einen erneuten Versuch gewagt:

String[] textureFilename = {
		    "stripe.png",
		    "stripe2.png"
		   };



// Number of textures.
  final int nbTexture = textureFilename.length;
  int[] textureId = new int[nbTexture];  
  GLFunc glF;
  GLUFunc gluF;

PngTextureLoader texLoader = new PngTextureLoader(glF, gluF);

  //   Retrieve the ImageComponent from the TextureLoader
	  gl.glEnable(GL.GL_TEXTURE_2D);
	  gl.glGenTextures(nbTexture, textureId, 0);		  
	  gl.glBindTexture(GL.GL_TEXTURE_2D, textureId[1]);

          texLoader.readTexture(textureFilename[1]);
	  texLoader.texImage2DNonScaled(true);  

      gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
      gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);

 gl.glBegin(GL.GL_TRIANGLES);
      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3f(0.0f, 1.0f, 0.0f);
      gl.glTexCoord2f(0.0f, 1.0f); 
      gl.glVertex3f(-1.0f, -1.0f, 0.0f);
      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3f(1.0f, -1.0f, 0.0f);
      gl.glEnd();

Ich kriege nur leider immer die Fehlermeldung: "An exception occured, while loading a PngTexture
java.lang.NullPointerException". Die 2 Bilder sind aber da und haben immer noch die nötigen Formate (8x16). Irgendein Tipp für mich. Ich wäre froh, wenn es endlich mal klappen würde...


----------



## Spacerat (3. Jun 2009)

Tips? Na Klar!
1. "glF" und "gluF" werden nicht initialisiert. Bei der Übergabe an den "PNGTextureLoader" sind sie immer noch "null". Daher wohl die NullPointerException.
2. Ich vermisse immer noch eine Zeile die ungefähr so aussieht:[highlight=java]gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 3, tex.width, tex.height, 0, GL.GL_RGB, 
                 GL.GL_UNSIGNED_BYTE, tex.data);[/highlight]So etwas in der Art müsste irgendwo zwischen "glBindTexture" und "glTextureParameter" auftauchen. Damit werden die Pixeldaten des Bildes an den Texturspeicher der GK übergeben (siehe Kapitel 6 NeHe-Tuts).


----------

