GLUT und Texturen oder ist GLUT abgemeldet?

Status
Nicht offen für weitere Antworten.

estartu

Mitglied
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
 
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
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.
Code:
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
 
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.
 
etwas, was ich früher mal gemacht habe mit Jogl:
Code:
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:
Code:
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben