Zwei Texturen mit unterschiedlichen UVs

Started by mech, October 15, 2012, 08:45:10 AM

Previous topic - Next topic

mech

Frage zu: JPCT-AE

Konkrete Anwendung: Wiederholte Textur auf einem Objekt, Lightmap soll auf dieses Objekt angewendet werden ==> Eigener UV Layer

Problem: Wie kann man einem Objekt zwei verschiedene UV Layouts zuweisen ohne über den Polygonmanager zu arbeiten?

Idee:

  • Objekt "normal" laden (UVs aus der 3ds Datei übernehmen, nicht manuell definieren), UVs werden hoffentlich für beide Texture Stages verwendet? (0 und 1)
  • Beide Texturen über TextureInfo anwenden, keine extra UVs angeben
  • Mit setTextureMatrix die Stage 0 auf das gewünschte UV Layout ändern (da man ja sonst nichts ändern kann außer die 0er)
  • Über einen Shader zusammenblenden (da der Shader ja Zugriff auf die Texturkoordinaten hat)

Fragen:
1)Kann das so funktionieren oder gibt es einen einfacheren Weg?
2)Wie ist die TextureMatrix aufgebaut? Wie komme ich von der obj/3ds Datei die ein UV Layout enthält auf eine Texture Matrix?
3)Beim hinzufügen (add) zu TextureInfo kann man UVs für ein Triangle angeben, was ist das?

EgonOlsen

Was spricht gegen den PolygonManager? Ein als 3ds geladenes Modell hat erst einmal gar keine zweite Texture-Stage. Wird eine neue Stage ergänzt, werden die Koordinaten der ersten übernommen. Ich würde (und tue das auch so) mit dem PolygonManager über alle Polygone gehen und die Koordinaten der Ebenen entsprechend setzen. Das geht über individuelle TextureInfos pro Vertex und das beantwortet auch deine Frage 3): Die sind dazu da, einem Punkt x Stages mit jeweils anderen Koordinaten zuweisen zu können. Da der Prozess nicht so ganz performant ist, über ich auf dem Desktop erledigen lassen und das serialisierte Objekt in Android laden.

Zur Idee mit der Matrix...ja, ging auch. Zumindest wenn ich das Problem richtig verstanden habe. In dem Fall wäre das einfach eine Skalierungsmatrix. Die Texture-Matrix ist eine ganz normale 4x4-Tranformationsmatrix. Da geht im Prinzip alles mit. In diesem Fall also z.B.


Matrix scale=new Matrix();
scale.set(0,0,scale);
scale.set(1,1,scale);
scale.set(2,2,scale);


Dazu brauchst du aber keine Shader. Wieso willst du das Blending im Shader machen? Das macht doch die Hardware schon bzw. die Defaultshader, wenn du GL ES 2.0 nutzt.