# GLUT und Texturen oder ist GLUT abgemeldet?



## estartu (23. Mai 2007)

Hallo.
Ich muss erst einmal sagen das ich neu bin im jogl programmieren und noch keinen Gesamtüberblick habe. Mir haben die GLUT-Befehle aber gut gefallen weil man da ziemlich leicht an dreidimensionale Körper ran kommt.
Ich habe mit den GLU-Befehlen einen Würfel gezeichnet und wollte ihn nun mit einer 
Textur belegen. Ich konnte im Internet aber nichts richtiges finden wie ich das anstellen soll. 
Die Beispiele beziehen sich immer auf Flächen und nicht auf 3-Dimensionale Körper.
Beim suchen im Internet bin ich auf die Aussage gestossen  das man GLUT nicht mehr verwenden soll da es nicht mehr weiter entwickelt wird und man solle sowieso alle dreidimensionalen Körper aus einfachen Flächen zusammensetzen und dann auf diese die Texturen anbringen.
Ist das so. Ist wirklich davon abzuraten Befehle zu benutzen die gleich dreidimensionale Objekte erzeugen?

Und gleich eine Frage hinterher.
Ich kann nun Flächen mit Texturen überziehen aber leider wird, egal wie klein ich die Textur auch mache die Textur immer über die ganze Fläche gezogen. Wie kann ich erreichen das die Textur wie Kacheln auf die Fläche gelegt wird. Das die Textur also dauernd wiederholt wird?


estartu


----------



## Evil-Devil (23. Mai 2007)

@Glut: Ja darauf solltest du verzichten. Glut macht aber auch nichts anderes als aus mehreren Faces ein Objekt zu erzeugen.

@Texture: Da musst du den WRAP Mode beim laden und erstellen der TExture in deinem Programm entsprechend festlegen.
Dies hier sollte dir dabei helfen  http://wiki.delphigl.com/index.php/glTexParameter


----------



## estartu (24. Mai 2007)

Hallo 
Danke für deine Hilfe aber das funktioniert bei mir nicht.
Ich war auf der Seite aber die benutzen 


gl.glTexParameterfv(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_WRAP_S,GL.GL_CLAMP);

oder

gl.glTexParameteriv(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_WRAP_S,GL.GL_CLAMP);

bei mir geht nur

gl.glTexParameterf(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_WRAP_S,GL.GL_CLAMP);

Ich habe mit folgendem code

```
gl.glEnable(GL.GL_TEXTURE_2D);
        gl.glBindTexture(GL.GL_TEXTURE_2D, texture);
        gl.glBegin(GL.GL_QUADS);

    	gl.glTexCoord2f(0f,0f);
    	gl.glVertex3f(0.0f, 0.0f, 0.0f);
    	
    	gl.glTexCoord2f(1f,0f);
    	gl.glVertex3f(3.0f, 0.f, 0.0f);
    		
    	gl.glTexCoord2f(1f,1f);
        gl.glVertex3f(3.0f, 3.0f, 0.0f);
            
        gl.glTexCoord2f(0f,1f);
        gl.glVertex3f(0.0f, 3.0f, 0.0f);
        gl.glEnd();
        gl.glDisable(GL.GL_TEXTURE_2D);
```
ein Viereck gemalt und benutze eine Textur von der Grösse 64x64 Pixel 
und egal ob ich GL_CLAMP oder GL_REPEAT einsetze die Textur wird immer über das ganze Viereck gelegt. Sie sieht ziemlich grob und verschwommen aus weil sie total gestreckt wird.
Sie wird leider nicht wie eine Kachel auf das viel grössere Viereck gelegt und wiederholt.

Was mache ich denn falsch?

Hier der code mit dem ich die Textur anlege.

```
public void defineTexture(GL gl,GLU glu)
{      
      gl.glShadeModel(GL.GL_SMOOTH);              // Enable Smooth Shading
      
      gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);	// Really Nice Perspective Calculations
      
      txg = new TextureGenerator();
      
      texture = txg.genTexture(gl);
      gl.glBindTexture(GL.GL_TEXTURE_2D,texture);
      
      BufferedImage img = txg.readPNGImage("muster_01.png");
      
      txg.makeRGBTexture(gl, glu, img, GL.GL_TEXTURE_2D, false);
      gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);
      gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);
  	
      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.glTexEnvf(GL.GL_TEXTURE_ENV,GL.GL_TEXTURE_ENV_MODE,GL.GL_REPLACE);
}
```
Ich bräuchte mal ein stück code von irgend jemand bei dem das auch auf dessen Rechner funktioniert.


estartu


----------



## Evil-Devil (25. Mai 2007)

Hmm, welche API nutzt du? JOGL, LWJGL, Java3D? Hast schonmal geschaut ob GL_CLAMP den umgekehrten Effekt erzeugt? Am Code seh ich eigentlich nichts verkehrtes.


----------



## merlin2 (25. Mai 2007)

Java3D mit _gl.gl_-Befehlen?


----------



## Der Müde Joe (27. Mai 2007)

etwas, was ich früher mal gemacht habe mit Jogl:

```
private Texture treeTex = null;

private void loadGLTextures(String[] strName) {
    	treeTex = TextureLoader.loadTextures(strName[1]);
}

private void drawTree(GL gl){
	    int x = 200;
	    int z = 200;
	    int y = height(heightMap, x, z);
		
	    drawIt(trees, treeTex, gl);
} 

private void drawIt(float[][] verts, Texture tex, GL gl){
	    // do not draw the transparent parts of the texture
	    gl.glEnable(GL.GL_BLEND);
	    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
	    // don't show source alpha parts in the destination
	
	    // determine which areas of the polygon are to be rendered
	    gl.glEnable(GL.GL_ALPHA_TEST);
	    gl.glAlphaFunc(GL.GL_GREATER, 0);  // only render if alpha > 0
	
	    // enable texturing
	    gl.glEnable(GL.GL_TEXTURE_2D);
	    tex.bind();
	
	    // replace the quad colours with the texture
	    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
		for(int i = 0 ; i < 50 ; i++){
		    gl.glBegin(GL.GL_QUADS);
			    gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(verts[i][0], verts[i][1], verts[i][2]); 
			    gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(verts[i][3], verts[i][4], verts[i][5]);
			    gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(verts[i][6], verts[i][7], verts[i][8]);
			    gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(verts[i][9], verts[i][10], verts[i][11]);
		    gl.glEnd();
		}
		
	    gl.glDisable(GL.GL_TEXTURE_2D);

	    // switch back to modulation of quad colours and texture
	    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
	    gl.glDisable(GL.GL_ALPHA);  // switch off transparency
	    gl.glDisable(GL.GL_BLEND);
	}	
	
	private void renderLineToTarget(GL gl){
			gl.glColor3f(1.0f,0.0f,0.0f);	
		
			gl.glBegin(GL.GL_LINE_STRIP);
	          	for(int i = 0 ; i < list.size(); i++){
	  				gl.glVertex3i(	list.get(i).getX(), 
	  								height(heightMap,list.get(i).getX(),list.get(i).getY())+2, 
	  								list.get(i).getY());	
	          	}
	    	gl.glEnd();
	    	
	    	gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
```

hab nur kurz überflogen und ist auch schon ne weile her...
aber war bei mir ziemlich gut...
vielleicht hilfts ja

EDIT:
da seh ich grad:

```
public class TextureLoader{


	/*
	 *returns the Texture
	 *input....the String filename
	 */
	public static Texture loadTextures(String fnm){
	    return loadTexture(fnm);
	}
	
	private static Texture loadTexture(String fnm){
		
	    String fileName = fnm;
	    Texture tex = null;
	    try {
	      tex = TextureIO.newTexture( new File(fileName), true);
	     tex.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
	     // tex.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
	    }
	    catch(Exception e)
	    { System.out.println("Error loading texture " + fileName);  }
	
	    return tex;
	} 	
}
```

das laden war ja in ner anderen Klasse


----------

