Frage

Wie kann ich wiederholen, um eine Auswahl eines Texturatlas?

Zum Beispiel mein Sprit (Auswahl) ist innerhalb der Texturkoordinaten:

GLfloat textureCoords[]=
{
    .1f,  .1f,
    .3f,  .1f,
    .1f,  .3f,
    .3f,  .3f
};

Dann Ich mag, dass Sprite wiederholen N-mal zu einem Dreieck Streifen (oder Quad), definiert durch:

GLfloat vertices[]=
{
   -100.f, -100.f,
    100.f, -100.f,
   -100.f,  100.f,
    100.f,  100.f
};

Ich weiß, es hat etwas mit GL_REPEAT und textureCoords zu tun, um den Bereich [0,1] weitergegeben würden. Dies funktioniert jedoch nicht: (versucht N = 10 zu wiederholen)

GLfloat textureCoords[]=
{
    10.1f,  10.1f,
    10.3f,  10.1f,
    10.1f,  10.3f,
    10.3f,  10.3f
};

Wir sehen unser voller Texturatlas wiederholt ...

Wie würde ich dies richtig tun?

War es hilfreich?

Lösung

Es kann nicht die Art und Weise getan werden, es in der Frage beschrieben wird. OpenGL Texturkoordiante Modi nur für die gesamte Textur anwenden.

Normalerweise wiederholt eine Textur, werden Sie ein Polygon zeichnen, die „größer“ als Ihre Textur ist impliziert. Zum Beispiel, wenn Sie eine quadratische Textur haben, die Sie mehrmals (etwa sechs) über eine größere Fläche wiederholen wollten, dann würden Sie ein Rechteck zeichnen, die so breit sechs Mal ist, wie es groß ist. Dann würden Sie setzen die Texturkoordinaten auf (0,0) - (6,1) und der Textur-Modus auf „wiederholen“. Wenn über die Polygon Interpolation koordiniert die Textur, die über 1 Willen geht, aufgrund aktiviert wiederholen wird „Wrap-around“ in der Textur, wodurch die Textur sechsmal über das Rechteck abgebildet werden.

Keine der Textur Wrap-Modi, die Art der Operation zu unterstützen, wie in der Frage beschrieben, das heißt, sie alle Karte in vollen [0,1] Bereich, nicht einige beliebige Teilmenge. wenn Sie Texturierung nur einen Teil der Textur verwendet wird, gibt es keine Möglichkeit zu geben, dass größere Textur in einer Art und Weise zu koordinieren, die OpenGL innerhalb nur der Sub-Rechteck wiederholen es macht.

Sie haben grundsätzlich zwei Möglichkeiten: Entweder eine neue Textur erstellen, die nur das Sprite hat man von der bestehenden Textur benötigen oder ein GLSL Vertex Programm schreiben, um die Textur abzubilden entsprechend Koordinaten

.

Andere Tipps

Ich bin mir nicht sicher, dass Sie das tun können. Ich denke, OpenGL Texturmodi koordinieren nur für die gesamte Textur anwenden. Wenn ein Atlas verwenden, sind Sie „Untertexturen“ verwendet wird, so dass Ihre Texturkoordinaten auf 0 und 1 nie nahe kommen, die normalen Grenzen, wo Wickel- und Klemm auftritt.

Es könnte Erweiterungen sein, damit umzugehen, ich habe nicht überprüft.

EDIT: Normalerweise eine Textur zu wiederholen, würden Sie ein Polygon zeichnen, die „größer“ als Ihre Textur impliziert ist. Zum Beispiel, wenn Sie eine quadratische Textur haben, die Sie mehrmals (etwa sechs) über eine größere Fläche wiederholen wollten, dann würden Sie ein Rechteck zeichnen, die so breit sechs Mal ist, wie es groß ist. Dann würden Sie setzen die Texturkoordinaten auf (0,0) - (6,1) und der Textur-Modus auf „wiederholen“. Wenn über die Polygon Interpolation koordiniert die Textur, die über 1 Willen geht, aufgrund aktiviert wiederholen wird „Wrap-around“ in der Textur, wodurch die Textur sechsmal über das Rechteck abgebildet werden.

Das ist ein bisschen roh, ohne Bilder zu erklären.

Wie auch immer, wenn Sie Texturierung nur einen Teil der Textur verwendet wird, gibt es keine Möglichkeit zu geben, dass größere Textur in eine Art und Weise zu koordinieren, die OpenGL macht es wiederholt innerhalb nur das Unter Rechteck.

Keine der Textur Wrap-Modi unterstützen die Art der Operation, die Sie suchen, das heißt, sie alle Karte in vollen [0,1] Bereich, nicht einige beliebige Teilmenge. Sie haben grundsätzlich zwei Möglichkeiten:. Entweder eine neue Textur erstellen, die nur das Sprit hat man von der bestehenden Textur benötigen oder ein GLSL Pixel Programm schreiben in geeigneter Weise die Textur abbilden Koordinaten

Dies ist zwar ein altes Thema sein; hier ist, wie ich es zu tun endete:

Eine Abhilfe wäre mehrere Maschen zu erstellen, zusammengeklebt, die Teilmenge der Textur UV ist enthalten.

Z. B .: Ich habe einen Laser Textur innerhalb eines größeren Texturatlas enthalten ist, bei U [0,05-0,1] & V [0,05-0,1].

I würde dann N Maschen konstruieren, von denen jeder U [0,05-0,1] & V [0,05-0,1] koordiniert. (.. N = Länge / texture.height; Höhe die Dimension der Textur zu sein, würde ich wiederholen, oder einfacher: die Höhe der Zeit, ich mag die Textur wiederholen)

würde diese Lösung kostengünstiger sein als Textur nach Textur neu zu laden. Vor allem, wenn Sie Batch alle Anrufe machen (wie Sie sollte).

(OpenGL ES 1.0,1.1,2.0 - Mobil Hardware 2011)

Kann nicht getan werden ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top