General > German corner

Fragen über Object3D (Texturen / Farben) [Android]

(1/4) > >>

Telix:
Hallo zusammen,

Aktuell arbeite ich an einem Spiel (Bin eigentlich Web / Desktop / Mobile Entwickler jedoch für Anwendungen).
Und habe direkt mehrere Fragen und hoffe ihr könnt mir helfen :)

Ich habe ein Object3D welches ein "halber" Würfel ist, er hat nur 3 Seiten den rest benötige ich nicht.

1. Wie bekomme ich eine Seite davon mit einer anderen Texture?
(Sprich ich möchte die Texture für eine Seite ändern sobald man drauf klickt)

2. Kann ich eine Seite Farblich kennzeichnen mit Texture?
(Sprich die Seite hat eine Texture und ich möchte, dass diese nun noch Blau oder Rot gefärbt wird)

3. Wie kann ich ein Würfel erzeugen, der nur die außen Linien hat?
(Sprich ein Würfel ohne Inhalt aber man jedoch die Kanten sieht)

Das wars vorerst :)

Vielen Dank für eure Hilfe!

EgonOlsen:

--- Quote from: Telix on November 07, 2013, 08:37:02 am ---1. Wie bekomme ich eine Seite davon mit einer anderen Texture?
(Sprich ich möchte die Texture für eine Seite ändern sobald man drauf klickt)

--- End quote ---
Im Prinzip geht das über den PolygonManager. Aber da musst du eine Besonderheit beachten: Du kannst nicht mehr verschiedene Texturen nutzen und/oder sie an anderen Stellen nutzen, als du sie beim ersten Rendern verwendet hast. D.h. du müsstest jeder Seite eine individuelle Textur zuweisen. Dann kannst du die nachträglich auch ändern. Wenn du am Anfang nur eine benutzt, wird deine Änderung ber den PolygonManager nicht funktionieren. Das liegt an der Art, wie der Grafikchip die Daten entgegennimmt. In deinem Fall würde ich einfach 3 einzelne
Object3Ds verwenden. Dann ist es einfacher, die Texturen zu ändern.

--- Quote from: Telix on November 07, 2013, 08:37:02 am ---2. Kann ich eine Seite Farblich kennzeichnen mit Texture?
(Sprich die Seite hat eine Texture und ich möchte, dass diese nun noch Blau oder Rot gefärbt wird)

--- End quote ---
Jein. Nicht, wenn alle Seiten zum selben  Object3D gehören. Wie oben erwähnt, würde ich das teilen. Dann kannst du mit setAdditionalColor() die Farben manipulieren (in den Grenzen der OpenGL-Beleuchtungsformeln, d.h. du kannst eine komplett grüne Textur nicht rot machen).

--- Quote from: Telix on November 07, 2013, 08:37:02 am ---3. Wie kann ich ein Würfel erzeugen, der nur die außen Linien hat?
(Sprich ein Würfel ohne Inhalt aber man jedoch die Kanten sieht)

--- End quote ---
Am einfachsten, indem du eine (evtl. transparente) Textur zuweist, die nur die Außenkanten zeigt. Wireframe an sich geht nicht, weil a) es in jPCT-AE aufgrund einer Limitierung von OpenGL ES nicht gut unterstützt wird und du b) sonst immer die Dreiecksgrenzen, nicht die Würfelkanten sehen würdest.

Telix:
erst mal vielen Dank! :)

Nun meine weiteren Fragen :D

1. Wie verhält sich die Performance bei einem object mit 3 seiten oder 3 objecten mit jeweils eine seite?
(wir reden hier nicht von 1 würfel sondern von 500 - 1000)

2. Spielt die anzahl von objecten überhaupt eine rolle (Verwaltungsaufwand?)

3. Texture einer Seite festlegen

Ich nutze:
box.addTriangle(upperLeftBack,0,0, upperLeftFront,0,1, upperRightBack,1,0, TextureManager.getInstance().getTextureID("stone"));
box.addTriangle(upperRightBack,1,0, upperLeftFront,0,1, upperRightFront,1,1, TextureManager.getInstance().getTextureID("stone"));

um die oberen triangle's zu erzeugen.

nun wollte ich mit:

dataObject.setTexture(new TextureInfo(TextureManager.getInstance().getTextureID("texture"), 0, 0, 0, 1, 1, 0));

die oberseite ändern jedoch verändert er die Texture vom ganzen würfel?!

Gruß
Michael

EgonOlsen:
Die Performance mit 3 Objekten wird etwas schlechter sein. Vermutlich aber nicht viel, weil das nur auf der Engine-Seite mehr Aufwand bedeutet. Für den Grafikchip ist es egal, denn für den werden die Daten ohnehin nach Texturverwendung gruppiert. D.h. sogenannte Draw-Calls hast du in beiden Fällen 3, bei 3 Objekten statt einem ist aber der Overhead der Engine größer. Generell sind 500-1000 Objekte bei Android eine Hausnummer. Musst du gucken, wie gut das noch funktioniert.

Damit ist auch Frage 2 beantwortet: Ja, eine ziemlich große! Die Anzahl Draw-Calls ist besonders auf Mobilgeräten entscheidend für die Performance. Wobei der Einfluss von Chip zu Chip schwankt. Bei PowerVR oder Mali ist es z.B. nicht so tragisch wie bei Adreno-Chips.

Zu Frage 3: Ja, weil das so nicht geht. Du änderst mit setTexture immer die Textur für das ganze Object3D. Wenn du einzelne Polygone ändern willst, musst du wie erwähnt den PolygonManager nehmen. Aber dann müsstest du alle anderen Flächen mit einer anderen Textur als "stone" behaften...das ist vielleicht nicht ganz klar, was ich damit meine und wieso das so ist. Ich versuche mal ein Erklärung:
Die Objekte werden beim ersten Rendern für die GPU "compiliert". Dabei werden gleichartige Polygone zusammengefasst, so dass sie in einem Draw-Call gerendert werden können. Haben nun alle Polygone dieselbe Textur, entsteht bei diesem Vorgang eine Struktur, die mit einem Draw-Call gezeichnet werden kann. Hast du z.B. drei verschiedene Texturen verwendet, entsteht eine Struktur, die mit drei Draw-Calls gerendet wird. Diese Struktur ist danach aber nicht mehr änderbar. D.h. wenn du einem Objekt, welches für einen Draw-Call compiliert worden ist, plötzlich drei Texturen zuweist, dann kann es damit nicht umgehen, weil die Strukur das nicht hergibt. Wenn du das machen willst, musst du gleich am Anfang die Grundlage dafür schaffen, damit das Objekt in 3 Draw-Calls zerlegt wird. Das tust du, indem du 3 unterschiedliche Texturen zuweist.

Telix:
wow super Erklärungen! Vielen Dank!

Hast du zufällig ein Beispiel oder Tipps nach was ich suchen kann beim PolygonManager?

Wie ich die Texturen einzelnd zuweise und dann später ändern kann?

weil ich hab nicht immer nur 3 seiten das kann unterschiedlich sein nach typ und dann wäre es glaube ich overkill dann für jede seite ein object zu machen.

Vielen Dank schonmal.

Navigation

[0] Message Index

[#] Next page

Go to full version