Main Menu

Texture Aufteilung

Started by Telix, November 25, 2013, 07:24:07 PM

Previous topic - Next topic

Telix

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!

EgonOlsen

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

Telix

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?

EgonOlsen

Quote from: Telix on November 25, 2013, 09:27:55 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

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.

Telix

#4
Auch hier bin ich zu blöd :(


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!

EgonOlsen

Deine letzten zwei Links sind identisch...

Telix


EgonOlsen

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.

Telix

ich lade alle meine Texturen mit folgendem Befehl:


private void addTexture(int id, String name) {
Texture newTexture = new Texture(getResources().getDrawable(id), true);
TextureManager.getInstance().addTexture(name, newTexture);
}

EgonOlsen

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.

Telix

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 :(

   
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);

EgonOlsen

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.

Telix

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?

EgonOlsen

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.

Telix

Am würfel selbst mach ich kein build oder strip selbst.

ich habe nun folgendes ausprobiert mit dem selben Ergebnis:


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.