www.jpct.net
General => German corner => Topic started 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!
-
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)
-
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?
-
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.
-
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!
-
Deine letzten zwei Links sind identisch...
-
korregiert :) sorry ^^
-
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.
-
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);
}
-
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.
-
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);
-
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.
-
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?
-
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.
-
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.
-
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.
-
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?
-
Ä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)) ???
-
Nun habe ich nur noch schwarze Polys
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);
-
Weil du keine Texturkoordinaten mehr setzt. Die müssen in die TextureInfo mit rein.
-
Das hat funktioniert :) danke!
-
was bewirkt genau setClamping(true);?
Hab es nun auf jeder Texture. Kann das schaden? Performance Verlust?
-
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.