# Bilder besser interpolieren



## dergrüne (2. Mrz 2008)

Servus,

ich habe ne kleine Frage, wieso interpoliert Java3D jpgs so schlecht?

Als beispiel ich habe eine Sphere mit dem Radius 1f und nicht in der Z Achse verschoben, also ist die Kugel recht groß.

Jetzt muss ich da aber eine 2048x2048er Texture von der Erde drüberbügeln, dass es einigermaßen gescheit aussieht.

Eigentlich müsste das Bild doppelt so groß sein, dass man keine Pixel mehr sieht und keine Treppen (AntiAliasing geht 

leider nicht, weil das verbugged ist). 2048² ist natürlich eine Hammertextur für jede Grafikkarte, ich frage mich einfach 

wie das bei anderen Spielen z.B. X3 - Reunion oder so gemacht wird, da sind die Objekte noch viel größer, aber die 

Texturen gestochen scharf, die können doch keine 16000er Texturen oder so verwenden.

Gibt es da einen Tip wie ich die Texturen schärfer bekomme, ohne noch mehr Pixel benutzen zu müssen. Z.B. einen 

anderen Interpolationsmodus oder so?

mfg Der Grüne

Hier noch der Code wie ich Texturen einlade:


```
public static Appearance texture(String s) {
		TextureLoader loader = new TextureLoader(s, TextureLoader.GENERATE_MIPMAP, null);		
        ImageComponent2D image = loader.getImage();
        int imageWidth = image.getWidth();
        int imageHeight = image.getHeight();
        int imageLevel = 0;
        image.setCapability(ImageComponent2D.ALLOW_IMAGE_WRITE);
        Texture2D texture = new Texture2D(Texture.MULTI_LEVEL_MIPMAP, Texture.RGB,imageWidth ,imageHeight);
        /*Texture2D texture = new Texture2D();
        int form  = texture.getFormat();
        int base = texture.getMipMapMode();
        texture = new Texture2D(base,form,image.getWidth(),image.getHeight());
        */
        texture.setImage(imageLevel, image);
        Appearance appear = new Appearance();
        
        while(imageHeight > 1 || imageWidth > 1){
        	//Imagelevel erhöhen
        	++imageLevel;
        	if(imageHeight > 1){
        		imageHeight /= 2;
        	}        	
        	if(imageWidth > 1){
        		imageWidth /= 2;
        	}
        	image = loader.getScaledImage(imageWidth, imageHeight);
        	texture.setImage(imageLevel, image);
        }
        
        
        appear.setTexture(texture);        
        TextureAttributes texat = new TextureAttributes(TextureAttributes.MODULATE,
        		                  new Transform3D(),new Color4f(),TextureAttributes.NICEST);
        appear.setTextureAttributes(texat);
        Material mat = new Material(new Color3f(0f,0f,0f),new Color3f(0f,0f,0f),new Color3f(0f,0f,0f),new Color3f(0f,0f,0f),100f);
        mat.setDiffuseColor(1, 1, 1, 255);
        appear.setMaterial(mat);        
        return(appear);	
	}
```


----------



## 0x7F800000 (2. Mrz 2008)

wenn eine textur ordentlich mit nem biliniaren filter gerendert wird, dann dürftest du da niemals irgendwelche pixel erkennen können. Man muss es bestimmt irgendwo auch in J3D einstellen können...

Ansonsten, was die texturen von Planeten angeht: bist du dir da sicher, dass sich auf der Oberfläche des Planeten absolut jedes erkennbare detail absolut einzigartig ist?
Bei großen landschaften speichert schließlich auch kein mensch die gesamte textur an einem stück... wäre es vielleicht möglich, die textur in viele kleine fragmente zu unterteilen (zB kleines rechteck für die Eiskappen an den Polen, ein kleines recheck für schmelzendes eis an den Polrändern, ein kleines recheck für eine ebene felslandschaft, ein kleines recheck für gebirgsketten, ein rechteck für blaue ozeane usw...) und dann in einer groben textur abspeichern, wo auf dem planeten welche textur-stücke hingehören? Mit Multitexturing kann man sich damit recht vernünftig aussehende landschaften zusammenbasteln, ohne dass man viel redundante informationen in einer riesentextur unterbringt...


----------



## dergrüne (2. Mrz 2008)

Das mit den Multitexturing stimmt schon, nur leider sind wir jetzt mehr oder weniger am Ende des Projektes und müssen es in zwei Wochen abgeben. Vor knapp 4 Monaten wusste ich es noch nicht besser und habe halt alles in einer großen Textur gemacht ich möchte halt jetzt nicht kurz vor der Abgabe nochmal alles umwerfen, zudem es auch noch andere Sachen gibt die gemacht werden müssen.

Von daher habe ich gedacht, dass es evtl. in Java nen Filter oder so für Texturen gibt, den man einfach einbauen kann, ohne an die Texturen selber rann zu müssen.

Danke für deine Antwort. Ich google mal ob es J3D sowas wie biliniare filter gibt.


----------



## 0x7F800000 (2. Mrz 2008)

Ich dachte der biliniare filter wär einfach ein felsenfestes hardware-element, das schon seit jahrzehnten auf jeder grafikkarte vorhanden ist, ohne dieses teil kann man doch kein einziges texturiertes dreick vernünftig auf den bildschirm zaubern... Dass man es evtl auch deaktivieren kann ist eine andere sache. 

Aber ich meine: das ist ja nicht "alles nochmal umwerfen", du musst einfach deine zeichenfunktion für die planeten ein bisschen anpassen, da dürften zwei wochen doch reichen :toll:


----------



## dergrüne (2. Mrz 2008)

Dank dir habs raus.

Einfach bei der Texture mit texture.setMagFilter(Texture.BASE_LEVEL_LINEAR); arbeiten. Super bilinear war das Zauberwort was mir in Google geholfen hat.


----------

