# lwjgl Texturen werden nicht gezeichnet



## tdc (3. Sep 2011)

Hi!

Ich habe ein größeres 3D-Projekt, das bisher allerdings nur aus farbigen Blöcken und Formen besteht. Jetzt habe ich versucht Texturen einzubinden. Allerdings erscheinen sie nicht, obwohl sie anscheinend richtig geladen werden. (Ich habe es mit texture.getImageWidth() überprüft und es wurde die richtige Breite ausgegeben, also werden sie wohl richtig geladen)
Wenn ich z.B. versuche auf eine Würfel eine Textur zu zeichnen, funktioniert es nicht und der Würfel ist einfach weiß.

Ich habe bereits in einem seperaten Projekt einen drehenden Würfel mit einer Textur erstellt und dort funktioniert es einwandfrei, mein aktuelles Projekt ist allerdings bereits etwas umfangreicher und ich habe daher keine Ahnung woran genau es liegen könnte.
Ich habe bereits versucht .jpg und .png - Texturen zu laden,

```
glEnable(GL_BLEND);
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
```
herauszunehmen, und einige andere Dinge, allerdings ist das Ergebnis immer das gleiche: der Würfel bleibt weiß.


Wo könnte das Probelm liegen?


Hier ein paar Codeausschnitte:

OpenGL-Initialisierung: (ich vermute, dass hier das Problem liegt)

```
public void initOpenGL()
	{	
		
		glEnable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH); // Enable Smooth Shading
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
        glClearDepth(1.0f); // Depth Buffer Setup
        glEnable(GL_DEPTH_TEST); // Enables Depth Testing
        glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
        glEnable(GL_BLEND);
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
        glLoadIdentity(); // Reset The Projection Matrix

        // Calculate The Aspect Ratio Of The Window
        GLU.gluPerspective(
                45.0f,
                (float) Display.getDisplayMode().getWidth() / (float) Display.getDisplayMode().getHeight(),
                0.1f,
                200.0f); //Renderweite
        glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix

        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
	}
```

Textur wird geladen: (mit Slick)

```
public Texture getTexture(String name)
	{
		Texture texture = null;
		try
		{
			texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("ressources/images/textures/glass1p2.png"));
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		return texture;
	}
```

Zeichenmethode des Würfels:

```
@Override
	public void drawOpenGL()
	{
		Color.white.bind();
		texture.bind();
		glBegin(GL_QUADS);
			// Front Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), getDeep());
			// Back Face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, 0);
			// Top Face
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, getHeight(), getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			// Bottom Face
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), 0, 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			// Right face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			// Left Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, getHeight(), getDeep());
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
	    glEnd();
	    texture.release();
	}
```


----------



## Kr0e (4. Sep 2011)

WAs genau macht Texture.release() ?? Das klingt für mich nach Textur löschen ...

DOC von Slick:

release()
          Destroy the texture reference


----------



## tdc (4. Sep 2011)

Oh, als ich das gemacht hab war ich bereits vollkommen verzweifelt und hab einfach rumprobiert. 

Nein, daran liegt es definitiv nicht, auch wenn ich es rausmache verändert sich nichts.


----------



## Kr0e (4. Sep 2011)

DAnn ahst du wenigstens schonmal eine Fehlerquelle ausgeschlossen. Der Code scheint ansich korrekt zu sein, obwohl ich das schon öfter gehört. Also in Bezug auf Slick + TExtures. OpenGL ist manchmal etwas haarig auf den Zähnen. Bei Texturen müssen auch die Filter + Wrap - Methoden angeben werden, auch wenn das eigentlcih der TExtureloader von Slick erledigen sollte.


----------



## tdc (4. Sep 2011)

Kr0e hat gesagt.:


> Bei Texturen müssen auch die Filter + Wrap - Methoden angeben werden, auch wenn das eigentlcih der TExtureloader von Slick erledigen sollte.



Ähm.... was? 

Ohne genau zu wissen was du meinst: soll ich das Binden der Texturen (texture.bind()) nicht über Slick sondern über OpenGL machen? Oder wie meinst du das?


----------



## Kr0e (4. Sep 2011)

Es wäre zumindest ein Versuch, so könnte man etwaige Slickfehler ausschließen.

Wenn man eine TExture mit OpenGL erstellt braucht man bestimmte Angaben vorher. Z.B:

OpenGL Texture Filter Parameters Explained  Greg Dolley’s Weblog



Hier mal ein kleines Tut für Texturebinding (pure OpenGL):

OpenGL Texture Tutorial


----------



## tdc (4. Sep 2011)

Okay, danke erstmal, ich werde mir das in den nächsten Tagen mal anschauen...



EDIT:

So, ich habe mir die Seiten jetzt mal genau angesehen. Zumindest die erste hat mir bedingt weitergeholfen. Diese "Angaben" (GL_NEAREST, etc.) kann man auch bei dem Laden der Textur über Slick angeben:

```
private void loadTexture(String name, String datatype)
	{
		try
		{
			texture = TextureLoader.getTexture(datatype, new FileInputStream(new File("").getAbsolutePath()+"/src/ressources/images/textures/"+name),GL_NEAREST);
			//unsauberes Laden :D - ist nur zum Texten
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
    }
```
Ich habe mal ein paar davon ausprobiert, die Textur wird aber leider immer noch nicht geladen.


Der Quellcode beim 2. Link ist leider in C und bisher habe ich noch nicht ganz hinbekommen, den Quellcode in Java umzuschreiben. Mein Problem ist das geladene Bild in einen IntBuffer zu bekommen. Ich habe zwar diese Anleitung gefunden, allerdings funktioniert bei mir

```
DataBuffer db = img.getRaster().getDataBuffer();
byte[] tmp = (DataBufferByte)db.getData();
```
nicht, bzw. es existiert keine Methode getData().  ???:L


----------



## Marco13 (5. Sep 2011)

Es wäre wohl 
byte[] tmp = ((DataBufferByte)db).getData();
(Klammern!) aber das ist gefährlich, wenn der Bildtyp nicht passt fliegt eine ClassCastException.

Aber darum ging es wohl auch weniger. Wichtiger ist (oder sollte sein) dass die Parameter, die dort unter "Texture Parameters" aufgelistet sind, auch alle angegeben werden. Danach sollte es eigentlich ein texture.bind() tun (obwohl ich die API von Slick da nicht genau genug kenne)


----------



## darman96 (6. Sep 2011)

öhhm ich bin zwar noch neu in java und erst recht openGL aber könnte es sein das das daran liegt das du oben bevor du die texture einbindest, die Farbe Weiß einbindest ??
hier:

```
@Override
    public void drawOpenGL()
    {
        Color.white.bind();
        texture.bind();
        glBegin(GL_QUADS);
```

Gruß darman96


----------



## tdc (6. Sep 2011)

@Marco:
Mist, ich hab doch schon geahnt, dass es an dem Klammern liegt. 
Danke.

@darman96:
Könnte sein... allerdings glaube ich mich daran erinnern zu können, dass es in einigen Beispielen genau so gemacht wurde. Naja, ich kann es ja mal ausprobieren.

Edit: Nein, an Color.white.bind() liegt es nicht.


----------



## darman96 (6. Sep 2011)

hmm hätte ja sein können aber ich bin ja nur anfänger *grins*


----------



## tdc (6. Sep 2011)

Bräuchte nochmal Hilfe beim Umstellen des Codes von Slick auf OpenGL. Also der Code sieht jetzt folgendermaßen aus:


```
@Override
	public void drawOpenGL()
	{
		//Color.white.bind();
		//texture.bind();
		glBindTexture(GL_TEXTURE_2D, 0);
		glBegin(GL_QUADS);
			// Front Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), getDeep());
			// Back Face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, 0);
			// Top Face
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, getHeight(), getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			// Bottom Face
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), 0, 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			// Right face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			// Left Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, getHeight(), getDeep());
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
	    glEnd();
	}
	
	// load a 256x256 RGB .RAW file as a texture
	public void LoadTextureRAW(String filename, boolean wrap)
	{
	    BufferedImage img = null;
		try
		{
			img = ImageIO.read(new File(new File("").getAbsolutePath()+"/src/ressources/images/textures/"+filename));
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	    DataBuffer db = img.getRaster().getDataBuffer();
	    byte[] tmp = ((DataBufferByte)(db)).getData();
	    ByteBuffer imagetransport = BufferUtils.createByteBuffer(tmp.length);
	    imagetransport.put(tmp);
	    imagetransport.flip();
	    IntBuffer intbuf = BufferUtils.createIntBuffer(1);
	    
	    // allocate a texture name
	    System.out.println(intbuf);
	    glGenTextures(intbuf);

	    // select our current texture
	    glBindTexture(GL_TEXTURE_2D, intbuf.get(0));
	    
	    glTexImage2D(GL_TEXTURE_2D,
	    				0,
	    				img.getColorModel().hasAlpha() ? GL_RGBA : GL_RGB,
	    				img.getWidth(),
	    				img.getHeight(),
	    				0,
	    				img.getColorModel().hasAlpha() ? GL_RGBA : GL_RGB,GL_UNSIGNED_BYTE,
	    				imagetransport //byte buffer
	    				);
	}
```

Erstmal ist es so ok? Wenn ja, wie binde ich die Textur an den Würfel? Eigentlich ja mit:

```
glBindTexture(GL_TEXTURE_2D, 0);
```
Aber wie finde ich die Texture ID der geladenen Textur heraus?

Also mit Slick fand ich das viel unkomplizierter...


----------



## Marco13 (6. Sep 2011)

OK.. Was genau war mit Slick einfacher (sorry, ich kenn mich damit nicht aus) - nur das Texturladen? Man könnte sagen: Ja, genau dafür ist Slick ja da! 

Vielleicht bräuchtest du das gar nicht so kompliziert zu machen, wie jetzt - vor allem weil das mit dem cast auf DataBufferByte, wie gesagt, gefährlich ist. 

Aber wie auch immer, für einen Test ob es grundsätzlich geht, und solange du kein Compilierbares Testbesipiel postest: Dort
glBindTexture(GL_TEXTURE_2D, intbuf.get(0));
wird ja schon die Texture-ID verwendet. Es kann ja mehrere geben. Für einen ersten Test könntest du die als privaten 'int' einfach speichern, und dann vor dem Zeichnen setzen

```
private int textureID;
...
// Beim Laden:
textureID = intbuf.get(0);
...
// Vor dem  Malen:
glBindTexture(GL_TEXTURE_2D, textureID);
```
Wenn's nicht hilft wäre ein Beispiel sicher gut zum testen, auch wenn ich z.B. Slick jetzt gerade nicht installiert hab'...


----------



## tdc (6. Sep 2011)

Okay, sobald ich wieder Zeit hab werde ich mal ein Beispiel hochladen... (zurzeit hab ich leider keine Zeit wegen Schule)


----------



## Kr0e (6. Sep 2011)

Marco13 hat gesagt.:


> OK.. Was genau war mit Slick einfacher (sorry, ich kenn mich damit nicht aus) - nur das Texturladen?



Slick ist in der Tat nicht allzu umfangreich, aber es werden einem viele lästige Routinen (Wie eben das Laden von Texturen, Audio, Input, 2D-Animationen) abgenommen.


----------



## tdc (8. Sep 2011)

Sooo.... ich habe jetzt mal ein (K)SKB zusammengestellt. Um es auszuführen braucht man LWJGL (die Jars "lwjgl" und "lwjgl_util") und Slick.

*Beschreibung:*
Ich habe jetzt die wichtigsten Klassen herausgesucht: Game, GameObject, Block, TexturedBlock und Start.

Game:
Die Spielklasse in der die Spielschleife und die OpenGL-Initialisierungs- und Zeichenmethode enthalten sind.

GameObject:
Jedes Objekt im Spiel erbt von dieser Klasse, in ihr sind z.B. die Methoden initDraw() und endDraw() enthalten. In der Spielschleife wird, wenn ein Objekt gezeichnet wird, immer erst initDraw(), dann drawOpenGL() (des Objektes) und endDraw() aufgerufen.

Block:
Ein farbiger Block, dessen Kanten hervorgehoben sind.

TexturedBlock:
Hier liegt mein Problem. Eigentlich soll ein Block mit einer Textur erscheinen, stattdessen erscheint ledeglich ein farbiger Block.

Start:
Zum Starten des Programms.

*Quellcode:*

Game:

```
package kskb;

import static org.lwjgl.opengl.GL11.*;

import java.util.Vector;

import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.util.glu.GLU;

public class Game
{
	long lastFrame;
	int fps;
	long lastFPS;
	
	Vector<GameObject> objects;
	
	public void start()
	{
		try
		{
			Display.setDisplayMode(new DisplayMode(800,600));
			Display.create();
			Display.setLocation(100, 100);
		}
		catch (LWJGLException e)
		{
			e.printStackTrace();
			System.exit(0);
		}
		
		initOpenGL();
		getDelta();
		lastFPS = getTime();
		initGame();

		while (!Display.isCloseRequested())
		{
			GLU.gluLookAt(10, 10, 10, 0, 0, 0, 0, 1, 0);
			int delta = getDelta();
			updateFPS();
			drawOpenGL();
			Display.update();
			Display.sync(200); // cap fps to 60fps
		}
		
		Display.destroy();
	}
	
	public void initGame()
	{
		objects = new Vector<GameObject>();
		
		objects.addElement(new Block(0,0,0,1,1,1,0.8f,0.8f,0.8f));
		objects.addElement(new TexturedBlock(3,0,0,1,1,1,new String[2]));
	}
	
	public int getDelta()
	{
	    long time = getTime();
	    int delta = (int) (time - lastFrame);
	    lastFrame = time;
	 
	    return delta;
	}
	
	public long getTime()
	{
	    return (Sys.getTime() * 1000) / Sys.getTimerResolution();
	}
	
	public void updateFPS()
	{
		if (getTime() - lastFPS > 1000)
		{
			Display.setTitle("FPS: " + fps);
			fps = 0;
			lastFPS += 1000;
		}
		fps++;
	}
	
	public void initOpenGL()
	{
		glEnable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH); // Enable Smooth Shading
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
        glClearDepth(1.0f); // Depth Buffer Setup
        glEnable(GL_DEPTH_TEST); // Enables Depth Testing
        glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
        glEnable(GL_BLEND);
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
        glLoadIdentity(); // Reset The Projection Matrix

        // Calculate The Aspect Ratio Of The Window
        GLU.gluPerspective(
                45.0f,
                (float) Display.getDisplayMode().getWidth() / (float) Display.getDisplayMode().getHeight(),
                0.1f,
                200.0f); //Renderweite
        glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix

        // Really Nice Perspective Calculations
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
	}
	
	public void drawOpenGL()
	{
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);          // Clear The Screen And The Depth Buffer  
		
		//3D
		for(GameObject obj:objects)
        {
        	obj.initDraw();
        	obj.drawOpenGL();
        	obj.endDraw();
        }
        
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        glOrtho(0,getWidth(),getHeight(),0,-1,1);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        //2D
        
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
	}
	
	public int getWidth()
	{
		return Display.getDisplayMode().getWidth();
	}
	
	public int getHeight()
	{
		return Display.getDisplayMode().getHeight();
	}
}
```

GameObject:

```
package kskb;

import static org.lwjgl.opengl.GL11.*;

public abstract class GameObject
{
	float x, y, z;
	float width, height, deep;
	float r, g, b;
	float alpha = 1.0f;
	
	float rotX, rotY;
	
	public abstract void drawOpenGL();
	
	public GameObject(float x, float y, float z, float width, float height, float deep, float r, float g, float b)
	{
		this.x = x;
		this.y = y;
		this.z = z;
		this.width = width;
		this.height = height;
		this.deep = deep;
		this.r = r;
		this.g = g;
		this.b = b;
		
		rotX = 0;
		rotY = 0;
	}
	
	public void initDraw()
	{
		glPushMatrix();
		//glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
		glColor4f(r,g,b,alpha);
        glTranslatef(x,y,z);
        glTranslatef(width/2,height/2,deep/2);
        glRotatef(rotY, 0.0f, 1.0f, 0.0f);
        glRotatef(rotX, 1.0f, 0.0f, 0.0f);
        glTranslatef(-width/2,-height/2,-deep/2);
	}
	
	public void endDraw()
	{
		glPopMatrix();
	}
	
	public void setX(float x)
	{
		this.x = x;
	}
	
	public void setY(float y)
	{
		this.y = y;
	}
	
	public void setZ(float z)
	{
		this.z = z;
	}
	
	public void setAlpha(float a)
	{
		alpha = a;
	}
	
	public float getX()
	{
		return x;
	}
	
	public float getY()
	{
		return y;
	}
	
	public float getZ()
	{
		return z;
	}
	
	public float getWidth()
	{
		return width;
	}
	
	public float getHeight()
	{
		return height;
	}
	
	public float getDeep()
	{
		return deep;
	}
	
	public void drawCube()
	{
		glBegin(GL_QUADS);                        // Draw A Quad
			// Front Face
    		glVertex3f(0, 0, deep); // Bottom Left Of The Texture and Quad
    		glVertex3f(width, 0, deep); // Bottom Right Of The Texture and Quad
    		glVertex3f(width, height, deep); // Top Right Of The Texture and Quad
    		glVertex3f(0, height, deep); // Top Left Of The Texture and Quad
    		// Back Face
    		glVertex3f(0, 0, 0); // Bottom Right Of The Texture and Quad
    		glVertex3f(0, height, 0); // Top Right Of The Texture and Quad
    		glVertex3f(width, height, 0); // Top Left Of The Texture and Quad
    		glVertex3f(width, 0, 0); // Bottom Left Of The Texture and Quad
    		// Top Face
    		glVertex3f(0, height, 0); // Top Left Of The Texture and Quad
    		glVertex3f(0, height, deep); // Bottom Left Of The Texture and Quad
    		glVertex3f(width, height, deep); // Bottom Right Of The Texture and Quad
    		glVertex3f(width, height, 0); // Top Right Of The Texture and Quad
    		// Bottom Face
    		glVertex3f(0, 0, 0); // Top Right Of The Texture and Quad
    		glVertex3f(width, 0, 0); // Top Left Of The Texture and Quad
    		glVertex3f(width, 0, deep); // Bottom Left Of The Texture and Quad
    		glVertex3f(0, 0, deep); // Bottom Right Of The Texture and Quad
    		// Right face
    		glVertex3f(width, 0, 0); // Bottom Right Of The Texture and Quad
    		glVertex3f(width, height, 0); // Top Right Of The Texture and Quad
    		glVertex3f(width, height, deep); // Top Left Of The Texture and Quad
    		glVertex3f(width, 0, deep); // Bottom Left Of The Texture and Quad
    		// Left Face
    		glVertex3f(0, 0, 0); // Bottom Left Of The Texture and Quad
    		glVertex3f(0, 0, deep); // Bottom Right Of The Texture and Quad
    		glVertex3f(0, height, deep); // Top Right Of The Texture and Quad
    		glVertex3f(0, height, 0); // Top Left Of The Texture and Quad
        glEnd();                                       // Done Drawing The Quad
        
        //***LINES AT EDGES***
        glColor3f(0,0,0);
        //Bottom
		glBegin(GL_LINES);
			glVertex3f(0, 0, 0);
			glVertex3f(width, 0, 0);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(width, 0, 0);
			glVertex3f(width, 0, deep);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(width, 0, deep);
			glVertex3f(0, 0, deep);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(0, 0, deep);
			glVertex3f(0, 0, 0);
		glEnd( );
		
		//Sides
		glBegin(GL_LINES);
			glVertex3f(0, 0, 0);
			glVertex3f(0, height, 0);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(width, 0, 0);
			glVertex3f(width, height, 0);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(width, 0, deep);
			glVertex3f(width, height, deep);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(0, 0, deep);
			glVertex3f(0, height, deep);
		glEnd( );
		
		//Top
		glBegin(GL_LINES);
			glVertex3f(0, height, 0);
			glVertex3f(width, height, 0);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(width, height, 0);
			glVertex3f(width, height, deep);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(width, height, deep);
			glVertex3f(0, height, deep);
		glEnd( );
		glBegin(GL_LINES);
			glVertex3f(0, height, deep);
			glVertex3f(0, height, 0);
		glEnd( );
	}
}
```

Block:

```
package kskb;

public class Block
	extends GameObject
{
	public Block(float x, float y, float z, float width, float height, float deep, float r, float g, float b)
	{
		super(x, y, z, width, height, deep, r, g, b);
	}
	
	public void drawOpenGL()
	{
		drawCube();
	}
}v
```

TexturedBlock:

```
package kskb;

import static org.lwjgl.opengl.GL11.*;

import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;

import javax.imageio.ImageIO;

import org.lwjgl.BufferUtils;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;

public class TexturedBlock
	extends GameObject
{
	Texture[] textures = new Texture[6];
	Texture texture;
	
	public TexturedBlock(float x, float y, float z, float width, float height, float deep, String[] texturenames)
	{
		super(x, y, z, width, height, deep, 0.8f, 0.8f, 0.8f);
		
		// *** VERSCHIEDENE METHODEN ZUM LADEN DER TEXTUR ***
		//TextureLibrary texturelibrary = new TextureLibrary();
		//LoadTextureRAW("texture.jpg", false);
		loadTexture("texture.png", "PNG");
		for(int t = 0; t < texturenames.length; t++)
		{
			//textures[t] = texturelibrary.getTexture(texturenames[t]);
		}
		//loadTexture("texture.jpg", "JPG");
	}
	
	@Override
	public void drawOpenGL()
	{
		//Color.white.bind();
		//texture.bind();
		glBindTexture(GL_TEXTURE_2D, 10);
		//System.out.println(GL_TEXTURE_HEIGHT);
		glBegin(GL_QUADS);
			// Front Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), getDeep());
			// Back Face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, 0);
			// Top Face
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, getHeight(), getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			// Bottom Face
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), 0, 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			// Right face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			// Left Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, getHeight(), getDeep());
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
	    glEnd();
	}
	
	private void loadTexture(String name, String datatype)
	{
		try
		{
			texture = TextureLoader.getTexture(datatype, new FileInputStream(new File("").getAbsolutePath()+"/src/kskb/"+name), GL_LINEAR_MIPMAP_NEAREST);
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
    }
	
	
	// Falls Slick nicht geht: OpenGL zum Laden der Texturen
	public void LoadTextureRAW(String filename, boolean wrap)
	{
	    BufferedImage img = null;
		try
		{
			img = ImageIO.read(new File(new File("").getAbsolutePath()+"/src/ressources/images/textures/"+filename));
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	    DataBuffer db = img.getRaster().getDataBuffer();
	    byte[] tmp = ((DataBufferByte)(db)).getData();
	    ByteBuffer imagetransport = BufferUtils.createByteBuffer(tmp.length);
	    imagetransport.put(tmp);
	    imagetransport.flip();
	    IntBuffer intbuf = BufferUtils.createIntBuffer(1);
	    
	    // allocate a texture name
	    System.out.println(intbuf);
	    glGenTextures(intbuf);

	    // select our current texture
	    glBindTexture(GL_TEXTURE_2D, intbuf.get(0));
	    
	    glTexImage2D(GL_TEXTURE_2D,
	    				0,
	    				img.getColorModel().hasAlpha() ? GL_RGBA : GL_RGB,
	    				img.getWidth(),
	    				img.getHeight(),
	    				0,
	    				img.getColorModel().hasAlpha() ? GL_RGBA : GL_RGB,GL_UNSIGNED_BYTE,
	    				imagetransport //byte buffer
	    				);
	}
}
```

Start:

```
package kskb;

public class Start
{
	public static void main(String[] args)
	{
		Game game = new Game();
		game.start();
	}
}
```


Wenn man es ausführt sieht man links oben einen "Block" und rechts unten einen "TexturedBlock".


----------



## Marco13 (8. Sep 2011)

Ohne das ", GL_LINEAR_MIPMAP_NEAREST" scheint's erstmal zu gehen. Dann noch im TexturedBlock am Anfang vom Rendern glEnable(GL_TEXTURE_2D), und am Anfang vom Rendern in GameObject glDisable(GL_TEXTURE_2D), dann sollte es schon einigermaßen passen. Was er jetzt gegen die Mipmap-Konstante hat, weiß ich spontan auch nicht...


----------



## Kr0e (9. Sep 2011)

Ich habe noch nie mit Mipmaps gearbeitet, aber mir dümpelt da im GEdächtnis was rum, dass man MipMaps doch iwie ncoh speziell erstellen muss, oder ?


----------



## Marco13 (9. Sep 2011)

Hätte ja sein können, dass das genau eine der ("lästigen") aufgaben ist, die einem Slick abnimmt.


----------



## Kr0e (9. Sep 2011)

hmmm, ich glaube sogar, dass es das tut. Aber der TO arbeitet nicht komplett mit Slick sondern nutzt nur Teilsegmente, was ich persönlich sowieso für fragwürdig halte. Slick hat teilweise "versteckte" Magie, gerade im Bezug auf Texturen, die ohne das Slicksystem ggf. stören (oder sogar keinen Sinn machen).


----------



## tdc (9. Sep 2011)

Danke, im KSKB gehts jetzt.

Jetzt habe ich versucht, es auf mein komplettes Programm zu übertragen und es funktioniert natürlich nicht... :shock:
Naja, jetzt werde ich erstmal mein komplettes Programm durchsuchen und schauen woran es liegen könnte.


----------



## tdc (30. Sep 2011)

Also das Problem besteht immer noch und ich finde es jetzt etwas merkwürdig.

Ich habe jetzt versucht an zwei Stellen im Code versucht, einen Würfel mit Textur zu erstellen. Einmal in meiner Hauptklasse "Game", wo es funktioniert, ich es aber nicht haben will und einmal in meiner Klasse "TexturedBlock" wo es hin soll, dort funktioniert es aber nicht.
Am Laden der Textur sollte es nicht liegen, da es aus einer Klasse "TextureLibrary" geladen wird - der Ablauf ist also immer der gleiche.

Hier der aktuelle Code:

*Klasse Game:*
Zeichenmethode in Spielschleife:

```
...
//3D
        if(objects != null)
        {
        	for(GameObject obj:objects)
        	{
        		obj.initDraw();
        		obj.drawOpenGL();
        		obj.endDraw();
        	}
        }
        //nur zum testen
        drawTestTexture();
...
```
Laden der Textur:

```
private void loadTestTexture()
	{
		TextureLibrary texturelibrary = new TextureLibrary();
		testtexture = texturelibrary.getTexture("");
    }
```
Zeichenmethode für Würfel: (funktioniert)

```
public void drawTestTexture()
	{
		glEnable(GL_TEXTURE_2D);
		glColor3f(1f,1f,1f);
		Color.white.bind();
		testtexture.bind();
		glBegin(GL_QUADS);
			// Front Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, 1);
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(1, 0, 1);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(1, 1, 1);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, 1, 1);
			// Back Face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, 1, 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(1, 1, 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(1, 0, 0);
			// Top Face
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, 1, 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 1, 1);
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(1, 1, 1);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(1, 1, 0);
			// Bottom Face
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(1, 0, 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(1, 0, 1);
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, 1);
			// Right face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(1, 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(1, 1, 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(1, 1, 1);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(1, 0, 1);
			// Left Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, 1);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, 1, 1);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, 1, 0);
		glEnd();
	}
```

*Klasse TexturedBlock:* (unfertig, sollte funktionieren)

```
package objects;

import static org.lwjgl.opengl.GL11.GL_QUADS;
import static org.lwjgl.opengl.GL11.glBegin;
import static org.lwjgl.opengl.GL11.glEnd;
import static org.lwjgl.opengl.GL11.glTexCoord2f;
import static org.lwjgl.opengl.GL11.glVertex3f;
import static org.lwjgl.opengl.GL11.glBindTexture;
import static org.lwjgl.opengl.GL11.*;

import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;

import javax.imageio.ImageIO;

import model.TextureLibrary;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureImpl;
import org.newdawn.slick.opengl.TextureLoader;

public class TexturedBlock
	extends Block
{
	//Texture[] textures = new Texture[6];
	Texture texture;
	
	public TexturedBlock(float x, float y, float z, float width, float height, float deep, String[] texturenames)
	{
		super(x, y, z, width, height, deep, 0.8f, 0.8f, 0.8f);
		//loadTexture("HighRiseGlass0003_1_S.jpg", "JPG");
		TextureLibrary texturelibrary = new TextureLibrary();
		//for(int t = 0; t < texturenames.length; t++)
		//{
		texture = texturelibrary.getTexture("");
		//}
	}
	
	@Override
	public void drawOpenGL()
	{
		glEnable(GL_TEXTURE_2D);
		Color.white.bind();
		texture.bind();
		glBegin(GL_QUADS);
			// Front Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), getDeep());
			// Back Face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, 0);
			// Top Face
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, getHeight(), getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			// Bottom Face
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), 0, 0);
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			// Right face
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(getWidth(), 0, 0);
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), 0);
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(getWidth(), getHeight(), getDeep());
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(getWidth(), 0, getDeep());
			// Left Face
			glTexCoord2f(0.0f, 0.0f);
			glVertex3f(0, 0, 0);
			glTexCoord2f(1.0f, 0.0f);
			glVertex3f(0, 0, getDeep());
			glTexCoord2f(1.0f, 1.0f);
			glVertex3f(0, getHeight(), getDeep());
			glTexCoord2f(0.0f, 1.0f);
			glVertex3f(0, getHeight(), 0);
	    glEnd();
	}
	
        //nicht benutzt
	private void loadTexture(String name, String datatype)
	{
		try
		{
			texture = TextureLoader.getTexture(datatype, new FileInputStream(new File("").getAbsolutePath()+"/src/ressources/images/textures/"+name));
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
    }
}
```

*Klasse TextureLibrary:*

```
package model;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class TextureLibrary
{
	public Texture getTexture(String name)
	{
		Texture texture = null;
		try
		{
			texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("ressources/images/textures/glass1p3.png"));
			
			System.out.println("Texture loaded: "+texture);
			System.out.println(">> Image width: "+texture.getImageWidth());
			System.out.println(">> Image height: "+texture.getImageHeight());
			System.out.println(">> Texture width: "+texture.getTextureWidth());
			System.out.println(">> Texture height: "+texture.getTextureHeight());
			System.out.println(">> Texture ID: "+texture.getTextureID());
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		return texture;
	}
}
```

Letztendlich wird der Würfel doch beide male auf die gleiche Weise gezeichnet. Warum geht es dann einmal nicht?


----------



## Marco13 (30. Sep 2011)

Das ist fast nicht nachzuvollziehen. Wenn man mal spekulativ-unfundiert annimmt, dass z.B. "Block" von "GameObject" erbt, stehen da immernoch so Zeilen wie
texture = texturelibrary.getTexture("");
wo man sich fragt, was genau dort passieren soll... 
Vielleicht KÖNNTE man genauer schauen, wenn du das ganze Compilier- und Startbar als ZIP hochlädst, aber ... da muss sich auch jemand finden, der sich die Zeit für's remote-debugging nehmen will...


----------



## tdc (30. Sep 2011)

Ich glaube es KÖNNTE sein, dass das gleich nicht mehr notwendig ist. Ich habe gerade mal versucht auf jeden Block eine Textur zu zeichnen und dabei ist mir aufgefallen, dass nur der erste Block im Vector objects eine Textur bekommen hat. Das erinnert mich stark an ein älteres Problem mit Fonts in Slick, bei dem auch immer nur der erste Schriftzug gezeichnet wurde. Das wurde dann durch ein "TextureImpl.bindNone()" behoben. Hier hilft es mir bisher noch nicht...
Scheint jedenfalls doch wieder an Slick zu liegen.


----------

