www.jpct.net

General => German corner => Topic started by: Telix on November 25, 2013, 07:24:07 pm

Title: Texture Aufteilung
Post by: Telix on November 25, 2013, 07:24:07 pm
Hallo zusammen,

Kann ich eine Texture mit mehreren Texturen nutzen?
Sprich ich habe ein 256x256 Image wo nun 4x4 Texturen drauf sind.

Wie kann ich daraus nun die entsprechende Texture bekommen? Oder muss ich jede Texture in ein eigenes Image packen?

Wie kann ich mehrere Texturen auf ein Poly setzen?
Will eine normale Texture setzen und dann oben drauf eine Texture drauf packen.
Diese ist in zwei bereiche eine schwarz und die andere transparent.

Wie bekomme ich das am besten hin?

Danke!
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 25, 2013, 08:58:38 pm
Ja, du kannst mehrere Texturen in einer kombinieren, aber das musst du dann in deinem Modeller oder im Code selber (wenn der die Objekte erzeugt) machen. Die Texturkoordinaten gehen dann eben nicht von 0..1 sondern von 0...0.5 und 0.5...1 usw. Wobei du dabei das Problem bekommst, dass der bilineare Filter der Texturen zwei benachbarte inander überblendet und das gibt hässliche Linien. Von daher eher 0...4.9 und 0.51...1 oder so. Da musst du ein bisschen probieren.

Mehrere Texturen pro Polygon: http://www.jpct.net/jpct-ae/doc/com/threed/jpct/TextureInfo.html (http://www.jpct.net/jpct-ae/doc/com/threed/jpct/TextureInfo.html)
Title: Re: Texture Aufteilung
Post by: Telix on November 25, 2013, 09:27:55 pm
Das mit den mehreren Texturen klappt bei mir nicht wirklich :(

Entweder wird alles nur noch farbig ohne Textur oder alles sehr weiß ohne Texture.
Oder das Objekt wird komplett Transparent oder sonstige komische Effekte :(

Ich habe 1 Solide Texture ohne Transparents und möchte darauf eine Texture mit Transparents.
Die 2 Grafik ist Schwarz / Transparenz damit möchte ich "Fog of War" abbilden...

Muss ich da was bestimmtes beachten?
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 25, 2013, 09:40:33 pm
Muss ich da was bestimmtes beachten?
Ja, und zwar das das nicht nachträglich geht, wenn die Ebenen nicht bereits im Ursprungsobjekt vorhanden waren. Du kannst die Texturen selber ändern, auch teilweise die Blendingmodes, aber du kannst nicht ein Objekt mit einer Texturschicht nehmen, rendern und dann plötzlich eine zweite draufpappen. Warum, das habe ich hier mal erklärt: http://www.jpct.net/forum2/index.php/topic,3659.msg25915.html#msg25915 (http://www.jpct.net/forum2/index.php/topic,3659.msg25915.html#msg25915)

Und müsstest also u.U. beim Erstellen ein volltransparent Textur als zweite Schicht benutzen und die bei Bedarf ändern.

Wenn es aber nur ums Abdunkeln geht, ist vielleicht auch setAdditionalColor mit negativen Werten einen Versuch wert.
Title: Re: Texture Aufteilung
Post by: Telix on November 26, 2013, 08:51:59 am
Auch hier bin ich zu blöd :(

Code: [Select]
addTriangle(upperLeftBack,0,0, upperLeftFront,0,1, upperRightBack,1,0);
addTriangle(upperRightBack,1,0, upperLeftFront,0,1, upperRightFront,1,1);
   
TextureInfo stoneTex = new TextureInfo(TextureManager.getInstance().getTextureID(textureName));
stoneTex.add(TextureManager.getInstance().getTextureID("fow_left"), TextureInfo.MODE_ADD);

_polygonManager.setPolygonTexture(maxPolyCount, stoneTex);
_polygonManager.setPolygonTexture(maxPolyCount+1, stoneTex);

Bild1: https://drive.google.com/file/d/0B26BJ5tHhzH_REhVRkU5VVJpdjQ/edit?usp=sharing
Bild2: https://drive.google.com/file/d/0B26BJ5tHhzH_WlpiLUlXb1Vhd3M/edit?usp=sharing

Und so schaut es bei mir aus: https://drive.google.com/file/d/0B26BJ5tHhzH_ZVY2ZnZsODY5S1U/edit?usp=sharing
Danke schonmal!
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 26, 2013, 01:20:18 pm
Deine letzten zwei Links sind identisch...
Title: Re: Texture Aufteilung
Post by: Telix on November 26, 2013, 01:24:19 pm
korregiert :) sorry ^^
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 26, 2013, 02:14:47 pm
Wie lädst du denn die Texturen? Wenn du einen Alpha-Kanal nutzen willst, musst im Konstruktor von Texture explizit den mit useAlpha nehmen. Ansonsten ist ihm der Alphakanal ziemlich egal.
Title: Re: Texture Aufteilung
Post by: Telix on November 26, 2013, 03:05:25 pm
ich lade alle meine Texturen mit folgendem Befehl:

Code: [Select]
private void addTexture(int id, String name) {
Texture newTexture = new Texture(getResources().getDrawable(id), true);
TextureManager.getInstance().addTexture(name, newTexture);
}
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 26, 2013, 05:50:45 pm
Also erstmal vorweg: Texturen sollten nicht in drawable gespeichert werden. Entweder in rwa oder gleich in assets. Android skaliert den Inhalt von drawable unter Umständen auf bestimmten Geräten und das kommt nicht gut bei Texturen.

Ansonsten sieht das Laden ok aus. Aber das mit dem Alpha-Wert klappt so nicht und schon gar nicht mit MODE_ADD. Du solltest deinen Verlauf besser direkt als Farbwerte ablegen. In diesem Fall einen Verlauf von Weiß nach Schwarz und dann mit MODE_MODULATE verknüpfen.
Title: Re: Texture Aufteilung
Post by: Telix on November 27, 2013, 10:01:25 am
ok das schaut besser aus :)

jedoch habe ich nun ein kleines Problem:
mit dem PolygonManager klappt es nicht :( Mit SetTexture aber schon.
Jedoch benötige ich das ja für 2 Polys nur :(

Code: [Select]
   
TextureInfo stoneTex = new TextureInfo(TextureManager.getInstance().getTextureID(textureName));
stoneTex.add(TextureManager.getInstance().getTextureID("fow_left"), TextureInfo.MODE_MODULATE);

// _polygonManager.setPolygonTexture(maxPolyCount, stoneTex);
// _polygonManager.setPolygonTexture(maxPolyCount+1, stoneTex);

setTexture(stoneTex);
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 27, 2013, 10:13:34 am
Vermutlich weil du nicht die richtigen Polygone erwischt. Ich weiß jetzt nicht, was maxPolyCount bei dir genau ist, aber maxPolyCount+1 erscheint mir zumindest merkwürdig. Wenn das max ist, was soll das max+1 sein? Ich würde sagen, probier mal aus, alle Polygone über den PolygonManager zu setzen. Wenn das geht, musst du nur die passenden finden.
Title: Re: Texture Aufteilung
Post by: Telix on November 27, 2013, 10:20:03 am
Der Name ist evtl. irreführend.
Jedoch füge ich 2 Polys hinzu nur diese 2 mehr gibts nicht sprich 0 und 1.
Es wird auch eine Texture angezeigt nur aber einfach eine Farbe ohne Texture.


So sieht es aus mit SetTexture:
https://drive.google.com/file/d/0B26BJ5tHhzH_ajhYdDI0TFp6QWc/edit?usp=sharing

So über den PolyManager:
https://drive.google.com/file/d/0B26BJ5tHhzH_MDRfSTFSSEJ1dlU/edit?usp=sharing

Desweiteren habe ich bei SetTexture ein recht unhübschen Rand. Woran liegt das?
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 27, 2013, 10:27:21 am
Was für einen Rand? Ich sehe nichts! Egal...wann setzt du denn die Textur? Gleich beim Erzeugen und vor dem build() oder nachträglich, d.h. nachdem die Objekte bereits einmal mit anderen Texture gerendert bzw. gebuilded worden sind?
Hast du mal probiert, alle Polygone zu setzen? Und nicht Object3D.strip() aufrufen, wenn du nachträglich Texturen umsetzen solltest...wobei ich nicht glaube, dass du das tust.
Title: Re: Texture Aufteilung
Post by: Telix on November 27, 2013, 10:31:55 am
Am würfel selbst mach ich kein build oder strip selbst.

ich habe nun folgendes ausprobiert mit dem selben Ergebnis:

Code: [Select]
int maxPolyID = _polygonManager.getMaxPolygonID();
for (int i = 0; i < maxPolyID; i++) {
_polygonManager.setPolygonTexture(i, stoneTex);
}

Den Rand sieht man ganz links und ist ca. 1 px breit. Würde sagen, dass er die 2. Texture nicht richtig passend gesetzt hat?
Also dass man die untere ein wenig sieht. Hab das Bild nochmal überprüft und es ist füllen also kein unabsichtlichen Rand im Bild.
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 27, 2013, 11:07:11 am
Dieser Rand kommt vom bilinearen Texturfilter, der quasi Teile vom anderen Texturrand mit verrechnet. Das kannst du verhindern, indem du auf der "Schattentextur" ein setClamping(true); ausführst.
Ansonsten: Wenn du ohnehin die Objekte aus Einzelpolygonen baust, dann bau sie doch gleich richtig. Sprich: Es gibt addTriangle-Methoden, die gleich die Texturen mit übergeben bekommen. Dann brauchst du keinen PolygonManager.
Title: Re: Texture Aufteilung
Post by: Telix on November 27, 2013, 11:26:03 am
unter android hat die methode addTriangle leider nur ein parameter für TextureID nicht für TextureInfo.
Gibt es noch ein anderen Weg? Gibt es ein Problem / Issue im PolyManager?
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 27, 2013, 12:50:48 pm
Ähh, da so: http://www.jpct.net/jpct-ae/doc/com/threed/jpct/Object3D.html#addTriangle(com.threed.jpct.SimpleVector, com.threed.jpct.SimpleVector, com.threed.jpct.SimpleVector, com.threed.jpct.TextureInfo) (http://www.jpct.net/jpct-ae/doc/com/threed/jpct/Object3D.html#addTriangle(com.threed.jpct.SimpleVector, com.threed.jpct.SimpleVector, com.threed.jpct.SimpleVector, com.threed.jpct.TextureInfo))  ???
Title: Re: Texture Aufteilung
Post by: Telix on November 27, 2013, 01:17:13 pm
Nun habe ich nur noch schwarze Polys

Code: [Select]
TextureInfo stoneTex = new TextureInfo(TextureManager.getInstance().getTextureID(textureName));
stoneTex.add(TextureManager.getInstance().getTextureID("fow_left"), TextureInfo.MODE_MODULATE);

// Upper
addTriangle(upperLeftBack, upperLeftFront, upperRightBack, stoneTex);
addTriangle(upperRightBack, upperLeftFront, upperRightFront, stoneTex);


Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 27, 2013, 02:36:50 pm
Weil du keine Texturkoordinaten mehr setzt. Die müssen in die TextureInfo mit rein.
Title: Re: Texture Aufteilung
Post by: Telix on November 27, 2013, 08:08:05 pm
Das hat funktioniert :) danke!
Title: Re: Texture Aufteilung
Post by: Telix on November 27, 2013, 08:10:05 pm
was bewirkt genau setClamping(true);?

Hab es nun auf jeder Texture. Kann das schaden? Performance Verlust?
Title: Re: Texture Aufteilung
Post by: EgonOlsen on November 27, 2013, 08:51:35 pm
Das bewirkt, dass Texturkoordinaten <0 und >1 nicht wrappen, sondern beim Maximalwert gekappt werden. Also wenn die Koordinate z.B. 1,5 ist, dann wird daraus mit Clamping 1 und ohne 0,5.  Für die Performance ist es egal. In deinem Fall ist es vermutlich sinnvoll, dass für alle Texture zu setzen.